{"Id":224,"Name":null,"Description":null,"FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","InProgress":false,"MessageTypes":[{"Id":7358,"Code":"ACK-SPEED","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-SPEED;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam;ACK-SPEED;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":7357,"Code":"ACK-WIFI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-WIFI;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam;ACK-WIFI;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6945,"Code":"ACK-VOL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-VOL;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5014,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getVolume","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar value = '34'; //10 Ring tone Volume\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":24},"CacheImei":false,"RegEx":"^Roam;ACK-VOL;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6945,\"Code\":\"ACK-VOL\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-VOL;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5014,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getVolume\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar value = '34'; //10 Ring tone Volume\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-VOL;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797142}],"Tags":[]},{"Id":6940,"Code":"ACK-FALLALERT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-FALLALERT;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5007,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getFallDownAlert","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '56'; //Fall down Alert code\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":8},"CacheImei":false,"RegEx":"^Roam;ACK-FALLALERT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6940,\"Code\":\"ACK-FALLALERT\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-FALLALERT;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5007,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getFallDownAlert\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '56'; //Fall down Alert code\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-FALLALERT;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796812}],"Tags":[]},{"Id":6939,"Code":"ACK-NOMOTION","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-NOMOTION;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5008,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getNoMotionAlert","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '53'; //No motion Alert code\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":7},"CacheImei":false,"RegEx":"^Roam;ACK-NOMOTION;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6939,\"Code\":\"ACK-NOMOTION\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-NOMOTION;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5008,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getNoMotionAlert\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '53'; //No motion Alert code\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-NOMOTION;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796979}],"Tags":[]},{"Id":6938,"Code":"ACK-CUSTID","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-CUSTID;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5010,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCustomId","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '47'; //Get device or custom id \r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":8},"CacheImei":false,"RegEx":"^Roam;ACK-CUSTID;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6938,\"Code\":\"ACK-CUSTID\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-CUSTID;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5010,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCustomId\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '47'; //Get device or custom id \\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-CUSTID;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796767}],"Tags":[]},{"Id":6937,"Code":"ACK-MODE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-MODE;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5005,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getPerformanceMode","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '44'; //time interval\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\n/* IMEI:863921033969786\r\nGSM signal quality: 15\r\nSoftware version: V07BX.8601.2109\r\nversion: V1.0.29.1 */\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":7,"Order":23},"CacheImei":false,"RegEx":"^Roam;ACK-MODE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6937,\"Code\":\"ACK-MODE\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-MODE;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5005,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getPerformanceMode\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '44'; //time interval\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\n/* IMEI:863921033969786\\r\\nGSM signal quality: 15\\r\\nSoftware version: V07BX.8601.2109\\r\\nversion: V1.0.29.1 */\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":7,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-MODE;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796970}],"Tags":[]},{"Id":6936,"Code":"ACK-LANG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-LANG;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":5004,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getSystemLanguage","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = '1F'; //System language - locale\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data); // For GPRS command\r\nAddValue('sequenceNumber', sequenceID);\r\n//AddValueSMS('dataSMS', dataSMS); // For SMS command\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":3,"Order":22},"CacheImei":false,"RegEx":"^Roam;ACK-LANG;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6936,\"Code\":\"ACK-LANG\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-LANG;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5004,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getSystemLanguage\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '1F'; //System language - locale\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data); // For GPRS command\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n//AddValueSMS('dataSMS', dataSMS); // For SMS command\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":3,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-LANG;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796960}],"Tags":[]},{"Id":6880,"Code":"ALSP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-ALSP;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALSP;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6888,"Code":"ALA-S","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ALA-S;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALA-S;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6929,"Code":"ACK-FIRM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-FIRM;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4957,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getFirmwareVersion","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar value = '1A'; //Ask for firmware Long\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'V?';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":16},"CacheImei":false,"RegEx":"^Roam;ACK-FIRM;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6929,\"Code\":\"ACK-FIRM\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-FIRM;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4957,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getFirmwareVersion\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar value = '1A'; //Ask for firmware Long\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'V?';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-FIRM;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796861}],"Tags":[]},{"Id":6912,"Code":"STP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-STP;<<imei>>;STATUS=<<status_data>>;ETIME=<<event_time>>;GENERAL=<<general>>;<<single_column_value>>;STP=<<step_data>>;LABEL=<<oysta_labels>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6912,\"Code\":\"STP\",\"Name\":null,\"MessageCode\":\"STEPS\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-STP;<<imei>>;STATUS=<<status_data>>;ETIME=<<event_time>>;GENERAL=<<general>>;<<single_column_value>>;STP=<<step_data>>;LABEL=<<rawlabel>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-STP;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;STP=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797573}],"Tags":[]},{"Id":6885,"Code":"Alert Finalized","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-SOSEnding;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-SOSEnding;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6864,"Code":"CYC","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-CYC;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6910,"Code":"CHK","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview-HTB;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Eview-HTB;[^;]*;STATUS=[^;;]*;TIME=[^;;]*;BATP=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6910,\"Code\":\"CHK\",\"Name\":null,\"MessageCode\":\"CHK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-HTB;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"<<ack_internal>>\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-HTB;[^;]*;STATUS=[^;;]*;TIME=[^;;]*;BATP=[^;;]*;SIGNAL=[^;;]*;WM=[^;;]*;GENERAL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744388113}],"Tags":[]},{"Id":6891,"Code":"BATL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-BATL;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-BATL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6892,"Code":"BATF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-BATF;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-BATF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6894,"Code":"ALNM","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-ALNM;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALNM;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6875,"Code":"ALSOS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-ALSOS;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALSOS;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6896,"Code":"ALMOV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-ALMOV;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALMOV;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6899,"Code":"ALA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-ALA;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALA;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6884,"Code":"F-ACK-No Memory","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300CFB3<<sequenceNumber>>7F0125","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300CFB3[^ ]*7F0125","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6901,"Code":"F-ACK-Invalid Parameter","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300EEA3<<sequenceNumber>>7F0124","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300EEA3[^ ]*7F0124","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6889,"Code":"F-ACK-Data Size Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB00030028C3<<sequenceNumber>>7F0122","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB00030028C3[^ ]*7F0122","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6905,"Code":"F-ACK-Command Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003009C85<<sequenceNumber>>7F0115","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003009C85[^ ]*7F0115","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6865,"Code":"ACK-Out Of Service","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003005BF1<<sequenceNumber>>7F0130","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003005BF1[^ ]*7F0130","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6935,"Code":"ACK-HB-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Set heart beat<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4918,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionConfigurationMode","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n    var data = `GPRSHB1M`;\r\n} else {\r\n    var data = `GPRSHB0M`; //`GPRSHB240S`;\r\n}\r\nAddValue('data', data);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":4,"Order":null},"CacheImei":false,"RegEx":"^Set heart beat[^t]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6935,\"Code\":\"ACK-HB-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Set heart beat<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4918,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionConfigurationMode\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nif (params.Controls.ConfigurationMode == 'true') {\\r\\n    var data = `GPRSHB1M`;\\r\\n} else {\\r\\n    var data = `GPRSHB240S`; //`GPRSHB0M`;\\r\\n}\\r\\nAddValue('data', data);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Set heart beat[^t]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796950}],"Tags":[]},{"Id":6934,"Code":"ACK-EPHONE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Set contact number 1 ok.|Configuracin numero contacto 1 ok.}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4962,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setEmergencySettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '30';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n    phone_number = params.AlertSettings.EmergencyNumber;\r\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\n    messageBody += sosKeyLength + key + confSOS + numberHex;\r\n    dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000';  //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":3},"CacheImei":false,"RegEx":"^(Set contact number 1 ok.|Configuracin numero contacto 1 ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6934,\"Code\":\"ACK-EPHONE\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set contact number 1 ok.|Configuracin numero contacto 1 ok.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4962,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    phone_number = params.AlertSettings.EmergencyNumber;\\r\\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":5},\"CacheImei\":false,\"RegEx\":\"^(Set contact number 1 ok.|Configuracin numero contacto 1 ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796791}],"Tags":[]},{"Id":6933,"Code":"ACK-SERV-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"GRPS:<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4954,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings5","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'GPRS?'; // Check Server Details\r\n/*GRPS: ON\r\nAPN: internet\r\nUsername:\r\nPassword:\r\nIP: 1, www.smart-locator.com\r\nPort: 6060\r\nMove report time: 30 minutes\r\nNo move report time: 60 minutes\r\nHB: on, 20 minutes */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":3687,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":21},"CacheImei":false,"RegEx":"^GRPS:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6933,\"Code\":\"ACK-SERV-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"GRPS:<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4954,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings5\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'GPRS?'; // Check Server Details\\r\\n/*GRPS: ON\\r\\nAPN: internet\\r\\nUsername:\\r\\nPassword:\\r\\nIP: 1, www.smart-locator.com\\r\\nPort: 6060\\r\\nMove report time: 30 minutes\\r\\nNo move report time: 60 minutes\\r\\nHB: on, 20 minutes */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":4958,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":21},\"CacheImei\":false,\"RegEx\":\"^GRPS:[^:]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797072}],"Tags":[]},{"Id":6932,"Code":"ACK-CONTAC-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"A1:<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4955,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings4","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'A?'; // Check Contact List\r\n/* A1: 1,1,15899795842\r\nA2: 1,0,13632770106\r\nA3: 0,1,15986236978 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":3687,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":20},"CacheImei":false,"RegEx":"^A1:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6932,\"Code\":\"ACK-CONTAC-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"A1:<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4955,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings4\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'A?'; // Check Contact List\\r\\n/* A1: 1,1,15899795842\\r\\nA2: 1,0,13632770106\\r\\nA3: 0,1,15986236978 */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":4958,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":20},\"CacheImei\":false,\"RegEx\":\"^A1:[^:]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796756}],"Tags":[]},{"Id":6931,"Code":"ACK-BEAC-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"1,<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4956,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings3","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'BCQ1'; // Check Beacon List\r\n/* 1,F7:37:B7:10:81:CE,office1\r\n2,C4:9F:A6:15:24:3F,office2\r\n3,D3:E3:AC:86:5E:46,office7 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":3687,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":19},"CacheImei":false,"RegEx":"^1,[^,]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6931,\"Code\":\"ACK-BEAC-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"1,<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4956,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings3\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'BCQ1'; // Check Beacon List\\r\\n/* 1,F7:37:B7:10:81:CE,office1\\r\\n2,C4:9F:A6:15:24:3F,office2\\r\\n3,D3:E3:AC:86:5E:46,office7 */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":4958,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":19},\"CacheImei\":false,\"RegEx\":\"^1,[^,]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796744}],"Tags":[]},{"Id":6930,"Code":"ACK-FALLSENS-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Mode:<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4968,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings2","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'status'; // Check fall sens (function settings)\r\n/* Mode:4,0 second\r\nLED: on\r\nBeep: on\r\nVibration: on\r\nTime zone: +10:00\r\nGEO Fence:0,0,0,0\r\nMotion alarm: off\r\nNo Motion alarm: off\r\nTilt alert: off\r\nFall alarm: on, level:5\r\nLow power alarm: on,15%\r\nSOS Call:10 minutes, loop:1  */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"CommandToUpdateId":null,"ParentId":3687,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":18},"CacheImei":false,"RegEx":"^Mode:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6930,\"Code\":\"ACK-FALLSENS-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Mode:<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4968,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings2\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'status'; // Check fall sens (function settings)\\r\\n/* Mode:4,0 second\\r\\nLED: on\\r\\nBeep: on\\r\\nVibration: on\\r\\nTime zone: +10:00\\r\\nGEO Fence:0,0,0,0\\r\\nMotion alarm: off\\r\\nNo Motion alarm: off\\r\\nTilt alert: off\\r\\nFall alarm: on, level:5\\r\\nLow power alarm: on,15%\\r\\nSOS Call:10 minutes, loop:1  */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":4958,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":18},\"CacheImei\":false,\"RegEx\":\"^Mode:[^:]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796837}],"Tags":[]},{"Id":6928,"Code":"ACK-FIRM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"IMEI:<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4958,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = '214A1A3440414243567356101F4453473330';\r\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '13';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":17},"CacheImei":false,"RegEx":"^IMEI:[^:]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6928,\"Code\":\"ACK-FIRM-SMS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"IMEI:<<data>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4958,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '214A1A3440414243567356101F4453473330';\\r\\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '13';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"CacheImei\":false,\"RegEx\":\"^IMEI:[^:]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796883}],"Tags":[]},{"Id":6927,"Code":"ACK-GDATA","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-GDATA;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4958,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getCurrentSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = '214A1A3440414243567356101F4453473330';\r\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '13';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":17},"CacheImei":false,"RegEx":"^Roam;ACK-GDATA;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6927,\"Code\":\"ACK-GDATA\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-GDATA;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4958,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '214A1A3440414243567356101F4453473330';\\r\\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '13';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-GDATA;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796921}],"Tags":[]},{"Id":6926,"Code":"ACK-SRV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Set IP ok.|Configuracin de IP OK}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4959,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setServer","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local APN':\r\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\r\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\r\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) APN and Server and Gateway Number\r\nvar messageBody = '02';\r\n// Server\r\nvar domain = '';\r\nvar port = '';\r\nvar serverLength = '00';\r\n// APN\r\nvar apn = '';\r\nvar apn_password = '';\r\nvar apn_username = '';\r\nvar apnLength = '00';\r\nvar apnUserLength = '00';\r\nvar apnPassLength = '00';\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.Server) {\r\n    var serverString = params.CommunicationSettings.Server.split(',');\r\n    domain = serverString[0];\r\n    port = serverString[1];\r\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\r\n    // Server IP and Port\r\n    domain = ascii_to_hexa(domain).toUpperCase();\r\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\r\n    // key 43 and TCP and GPRS is 80\r\n    messageBody += serverLength + \"4380\" + port + domain;\r\n    // For SMS\r\n    dataSMS = `IP1,${serverString[0]},${serverString[1]}`;\r\n}\r\nif (params.CommunicationSettings.APN) {\r\n    var apnString = params.CommunicationSettings.APN.split(',');\r\n    // APN\r\n    apn = apnString[0];\r\n    apn = ascii_to_hexa(apn).toUpperCase();\r\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnLength + \"40\" + apn;\r\n    // APN username\r\n    apn_username = apnString[1];\r\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\r\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnUserLength + \"41\" + apn_username;\r\n    // APN passwprd\r\n    apn_password = apnString[2];\r\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\r\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnPassLength + \"42\" + apn_password;\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^(Set IP ok.|Configuracin de IP OK)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6926,\"Code\":\"ACK-SRV\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set IP ok.|Configuracin de IP OK}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4959,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setServer\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//para pruebas en local APN':\\r\\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\\r\\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\\r\\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02) APN and Server and Gateway Number\\r\\nvar messageBody = '02';\\r\\n// Server\\r\\nvar domain = '';\\r\\nvar port = '';\\r\\nvar serverLength = '00';\\r\\n// APN\\r\\nvar apn = '';\\r\\nvar apn_password = '';\\r\\nvar apn_username = '';\\r\\nvar apnLength = '00';\\r\\nvar apnUserLength = '00';\\r\\nvar apnPassLength = '00';\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.Server) {\\r\\n    var serverString = params.CommunicationSettings.Server.split(',');\\r\\n    domain = serverString[0];\\r\\n    port = serverString[1];\\r\\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\\r\\n    // Server IP and Port\\r\\n    domain = ascii_to_hexa(domain).toUpperCase();\\r\\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\\r\\n    // key 43 and TCP and GPRS is 80\\r\\n    messageBody += serverLength + \\\"4380\\\" + port + domain;\\r\\n    // For SMS\\r\\n    dataSMS = `IP1,${serverString[0]},${serverString[1]}`;\\r\\n}\\r\\nif (params.CommunicationSettings.APN) {\\r\\n    var apnString = params.CommunicationSettings.APN.split(',');\\r\\n    // APN\\r\\n    apn = apnString[0];\\r\\n    apn = ascii_to_hexa(apn).toUpperCase();\\r\\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnLength + \\\"40\\\" + apn;\\r\\n    // APN username\\r\\n    apn_username = apnString[1];\\r\\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\\r\\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnUserLength + \\\"41\\\" + apn_username;\\r\\n    // APN passwprd\\r\\n    apn_password = apnString[2];\\r\\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\\r\\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnPassLength + \\\"42\\\" + apn_password;\\r\\n}\\r\\n// create HEADER\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":0},\"CacheImei\":false,\"RegEx\":\"^(Set IP ok.|Configuracin de IP OK)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797089}],"Tags":[]},{"Id":6925,"Code":"ACK-GTW","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Set contact number 10 ok.|Configuracin numero contacto 10 ok.}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4960,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setGateway","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '30';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar sosKeyLength = '00';\r\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.SMSGateway) {\r\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\r\n    var gateway = gatewayString[1];\r\n    gateway_number = gatewayString[0];\r\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\r\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\r\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\n    messageBody += sosKeyLength + key + confSOS + numberHex;\r\n    dataSMS = `A10,1,0,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000';  //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":2},"CacheImei":false,"RegEx":"^(Set contact number 10 ok.|Configuracin numero contacto 10 ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6925,\"Code\":\"ACK-GTW\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set contact number 10 ok.|Configuracin numero contacto 10 ok.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4960,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setGateway\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar gateway_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.SMSGateway) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\\r\\n    var gateway = gatewayString[1];\\r\\n    gateway_number = gatewayString[0];\\r\\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\\r\\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A10,0,0,${gateway_number}`; //  doesn't accept SMS+ Untogle Call\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":2},\"CacheImei\":false,\"RegEx\":\"^(Set contact number 10 ok.|Configuracin numero contacto 10 ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796940}],"Tags":[]},{"Id":6924,"Code":"ACK-FALLSENS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Set fall down alarm ok!|Configuracin alarma caida ok!}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4961,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setFallSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02)  Fall sensitivity\r\nvar messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n    value += '1'\r\n    value += '100' //Dial\r\n    //}\r\n    if (params.FallSettings.Sensitivity) {\r\n        var sensiString = params.FallSettings.Sensitivity.split(',');\r\n        var level = sensiString[1];\r\n        sensitivity = parseInt(sensiString[0]);\r\n        // For SMS\r\n        dataSMS = `FL1,${sensitivity},1`;\r\n        //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\r\n        sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n        value += sensitivity\r\n    }\r\n} else {\r\n    value = '00000000'\r\n    dataSMS = `FL0,1,1`;\r\n}\r\n// create HEADER\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\r\nvar command = '02'\r\nvar keyLength = '02'\r\nvar key = '56'\r\nvar messageBody = command + keyLength + key + value\r\nvar checksum = byteStringToByteArray(messageBody)\r\nchecksum = crc16byte(checksum)\r\nchecksum = decimalToHex(checksum)\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\r\nchecksum = changeEndianness(checksum)\r\n//Hpw to calculate sequenceID\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\r\nvar data = prefix + messageBody\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":4},"CacheImei":false,"RegEx":"^(Set fall down alarm ok!|Configuracin alarma caida ok!)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6924,\"Code\":\"ACK-FALLSENS\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set fall down alarm ok!|Configuracin alarma caida ok!}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4961,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setFallSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02)  Fall sensitivity\\r\\nvar messageBody = '02';\\r\\nvar sensitivity = '';\\r\\nvar dataSMS = '';\\r\\nvar value = ''\\r\\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\\r\\n    value += '1'\\r\\n    value += '100' //Dial\\r\\n    //}\\r\\n    if (params.FallSettings.Sensitivity) {\\r\\n        var sensiString = params.FallSettings.Sensitivity.split(',');\\r\\n        var level = sensiString[1];\\r\\n        sensitivity = parseInt(sensiString[0]);\\r\\n        // For SMS\\r\\n        dataSMS = `FL1,${sensitivity},1`;\\r\\n        //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\\r\\n        sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\\r\\n        value += sensitivity\\r\\n    }\\r\\n} else {\\r\\n    value = '00000000'\\r\\n    dataSMS = `FL0,1,1`;\\r\\n}\\r\\n// create HEADER\\r\\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\\r\\nvar command = '02'\\r\\nvar keyLength = '02'\\r\\nvar key = '56'\\r\\nvar messageBody = command + keyLength + key + value\\r\\nvar checksum = byteStringToByteArray(messageBody)\\r\\nchecksum = crc16byte(checksum)\\r\\nchecksum = decimalToHex(checksum)\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\\r\\nchecksum = changeEndianness(checksum)\\r\\n//Hpw to calculate sequenceID\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\\r\\nvar data = prefix + messageBody\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^(Set fall down alarm ok!|Configuracin alarma caida ok!)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796821}],"Tags":[]},{"Id":6923,"Code":"ACK-APN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Set APN ok.|Configuracin APN OK.}}","HasTemplateGlobal":false,"ResponseTemplate":"ok1","TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4963,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setAPN","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local APN':\r\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\r\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\r\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) APN and Server and Gateway Number\r\nvar messageBody = '02';\r\n// Server\r\nvar domain = '';\r\nvar port = '';\r\nvar serverLength = '00';\r\n// APN\r\nvar apn = '';\r\nvar apn_password = '';\r\nvar apn_username = '';\r\nvar apnLength = '00';\r\nvar apnUserLength = '00';\r\nvar apnPassLength = '00';\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.Server) {\r\n    var serverString = params.CommunicationSettings.Server.split(',');\r\n    domain = serverString[0];\r\n    port = serverString[1];\r\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\r\n    // Server IP and Port\r\n    domain = ascii_to_hexa(domain).toUpperCase();\r\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\r\n    // key 43 and TCP and GPRS is 80\r\n    messageBody += serverLength + \"4380\" + port + domain;\r\n}\r\nif (params.CommunicationSettings.APN) {\r\n    var apnString = params.CommunicationSettings.APN.split(',');\r\n    // APN\r\n    apn = apnString[0];\r\n    apn = ascii_to_hexa(apn).toUpperCase();\r\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnLength + \"40\" + apn;\r\n    // APN username\r\n    apn_username = apnString[1];\r\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\r\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnUserLength + \"41\" + apn_username;\r\n    // APN passwprd\r\n    apn_password = apnString[2];\r\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\r\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnPassLength + \"42\" + apn_password;\r\n    // For SMS\r\n    dataSMS = `S1,${apnString[0]},${apnString[1]},${apnString[2]}`;\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":0},"CacheImei":false,"RegEx":"^(Set APN ok.|Configuracin APN OK.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6923,\"Code\":\"ACK-APN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set APN ok.|Configuracin APN OK.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ok1\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4963,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setAPN\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//para pruebas en local APN':\\r\\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\\r\\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\\r\\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02) APN and Server and Gateway Number\\r\\nvar messageBody = '02';\\r\\n// Server\\r\\nvar domain = '';\\r\\nvar port = '';\\r\\nvar serverLength = '00';\\r\\n// APN\\r\\nvar apn = '';\\r\\nvar apn_password = '';\\r\\nvar apn_username = '';\\r\\nvar apnLength = '00';\\r\\nvar apnUserLength = '00';\\r\\nvar apnPassLength = '00';\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.Server) {\\r\\n    var serverString = params.CommunicationSettings.Server.split(',');\\r\\n    domain = serverString[0];\\r\\n    port = serverString[1];\\r\\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\\r\\n    // Server IP and Port\\r\\n    domain = ascii_to_hexa(domain).toUpperCase();\\r\\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\\r\\n    // key 43 and TCP and GPRS is 80\\r\\n    messageBody += serverLength + \\\"4380\\\" + port + domain;\\r\\n}\\r\\nif (params.CommunicationSettings.APN) {\\r\\n    var apnString = params.CommunicationSettings.APN.split(',');\\r\\n    // APN\\r\\n    apn = apnString[0];\\r\\n    apn = ascii_to_hexa(apn).toUpperCase();\\r\\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnLength + \\\"40\\\" + apn;\\r\\n    // APN username\\r\\n    apn_username = apnString[1];\\r\\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\\r\\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnUserLength + \\\"41\\\" + apn_username;\\r\\n    // APN passwprd\\r\\n    apn_password = apnString[2];\\r\\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\\r\\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnPassLength + \\\"42\\\" + apn_password;\\r\\n    // For SMS\\r\\n    dataSMS = `S1,${apnString[0]},${apnString[1]},${apnString[2]}`;\\r\\n}\\r\\n// create HEADER\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":1},\"CacheImei\":false,\"RegEx\":\"^(Set APN ok.|Configuracin APN OK.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796735}],"Tags":[]},{"Id":6922,"Code":"ACK-RTL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Device location request have received!|Solicitud de ubicacin recibida!}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4964,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionRealTimeLocation","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '01';\r\nvar key = '12';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/*  Answer from the device\r\nGPS Loc!\r\nNow:\r\nLoc Time:07/04/2021 17:36:44\r\nSpeed:0km/h\r\nAltitude:97.0\r\nBattery:57%\r\nwww.google.com/maps?q=22.6537233,114.0006070\r\n*/\r\nvar dataSMS = 'loc';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":10},"CacheImei":false,"RegEx":"^(Device location request have received!|Solicitud de ubicacin recibida!)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6922,\"Code\":\"ACK-RTL\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Device location request have received!|Solicitud de ubicacin recibida!}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4964,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionRealTimeLocation\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '01';\\r\\nvar key = '12';\\r\\nvar totalLenght = '0300';\\r\\nvar keyLength = '01';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\n/*  Answer from the device\\r\\nGPS Loc!\\r\\nNow:\\r\\nLoc Time:07/04/2021 17:36:44\\r\\nSpeed:0km/h\\r\\nAltitude:97.0\\r\\nBattery:57%\\r\\nwww.google.com/maps?q=22.6537233,114.0006070\\r\\n*/\\r\\nvar dataSMS = 'loc';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^(Device location request have received!|Solicitud de ubicacin recibida!)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797060}],"Tags":[]},{"Id":6921,"Code":"ACK-TRACE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Set live tracking","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4965,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionTrace","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '01';\r\nvar key = '13';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/*  Answer from the device\r\nSet live tracking every 10 seconds and last for 10 minutes ok.\r\n*/\r\nvar dataSMS = 'CL10s,600s'; // CL(interval),(duration)\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":3,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":11},"CacheImei":false,"RegEx":"^Set live tracking","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6921,\"Code\":\"ACK-TRACE\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Set live tracking\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4965,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionTrace\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '01';\\r\\nvar key = '13';\\r\\nvar totalLenght = '0300';\\r\\nvar keyLength = '01';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\n/*  Answer from the device\\r\\nSet live tracking every 10 seconds and last for 10 minutes ok.\\r\\n*/\\r\\nvar dataSMS = 'CL10s,600s'; // CL(interval),(duration)\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":3,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Set live tracking\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797105}],"Tags":[]},{"Id":6920,"Code":"ACK-GSRV","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-GSRV;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4966,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getServer","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar value = '43'; //Ask for Server\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":null},"CacheImei":false,"RegEx":"^Roam;ACK-GSRV;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6920,\"Code\":\"ACK-GSRV\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-GSRV;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4966,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getServer\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar value = '43'; //Ask for Server\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-GSRV;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796930}],"Tags":[]},{"Id":6919,"Code":"ACK-GAPN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam;ACK-GAPN;<<imei>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4967,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"getAPN","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar value = '40'; //Ask for APN\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":null},"CacheImei":false,"RegEx":"^Roam;ACK-GAPN;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6919,\"Code\":\"ACK-GAPN\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam;ACK-GAPN;<<imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4967,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getAPN\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar value = '40'; //Ask for APN\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam;ACK-GAPN;[^;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796909}],"Tags":[]},{"Id":6918,"Code":"ACK-OFF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Power OFF!!!","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4971,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionPowerOff","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '14';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'off';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":14},"CacheImei":false,"RegEx":"^Power OFF!!!","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6918,\"Code\":\"ACK-OFF\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Power OFF!!!\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4971,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionPowerOff\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '14';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'off';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Power OFF!!!\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796990}],"Tags":[]},{"Id":6917,"Code":"ACK-FLU","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{flush ok.|Borrar ok.}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4969,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionDeleteRecords","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '10';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'flush';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":9},"CacheImei":false,"RegEx":"^(flush ok.|Borrar ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6917,\"Code\":\"ACK-FLU\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{flush ok.|Borrar ok.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4969,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionDeleteRecords\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '10';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'flush';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^(flush ok.|Borrar ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781796898}],"Tags":[]},{"Id":6916,"Code":"ACK-RST","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Set ok.|reset ok.|Reiniciar ok.}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4981,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionFactoryReset","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nvar configsSMS = [];\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '04';\nvar keyLength = '01';\nvar key = '11';\nvar messageBody = command + keyLength + key;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\nvar data = prefix + messageBody;\n// For GPRS command\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\n// For SMS command\nvar dataSMS = 'ineedtoresetEV-06A!';\nAddValueSMS('dataSMS', dataSMS);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs,\n    configsSMS: configsSMS\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configsSMS.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":15},"CacheImei":false,"RegEx":"^(Set ok.|reset ok.|Reiniciar ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6916,\"Code\":\"ACK-RST\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{Set ok.|reset ok.|Reiniciar ok.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4981,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'ineedtoresetEV04!';\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs,\\n    configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^(Set ok.|reset ok.|Reiniciar ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797052}],"Tags":[]},{"Id":6915,"Code":"ACK-PREFIX","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"remove prefix ok.","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4984,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"setSMSPrefix","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nif (params.SMSPrefix.SMSPrefix == 'true') { //Enable Prefix for SMS anwers\r\n    if (params.SMSPassword.SMSPasswordOld) {\r\n        var data = `${params.SMSPassword.SMSPasswordOld}Prefix1,Rio-${serverParams.Imei}-`;\r\n    } else {\r\n        var data = `Prefix1,Rio-${serverParams.Imei}-`;\r\n    }\r\n} else {\r\n    var data = `Prefix0,`; //Disable Prefix for SMS anwers\r\n}\r\nAddValue('data', data);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":2,"Order":null},"CacheImei":false,"RegEx":"^remove prefix ok.","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6915,\"Code\":\"ACK-PREFIX\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"remove prefix ok.\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4984,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSMSPrefix\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nif (params.SMSPrefix.SMSPrefix == 'true') { //Enable Prefix for SMS anwers\\r\\n    if (params.SMSPassword.SMSPasswordOld) {\\r\\n        var data = `${params.SMSPassword.SMSPasswordOld}Prefix1,Rio-${serverParams.Imei}-`;\\r\\n    } else {\\r\\n        var data = `Prefix1,Rio-${serverParams.Imei}-`;\\r\\n    }\\r\\n} else {\\r\\n    var data = `Prefix0,`; //Disable Prefix for SMS anwers\\r\\n}\\r\\nAddValue('data', data);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^remove prefix ok.\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797013}],"Tags":[]},{"Id":6914,"Code":"RTL-GPS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{Now:Loc Time: |Ubicacin GPS:Tiempo de Loc: }}<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4983,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionRequestLocation","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nif (params.SMSPassword.SMSPasswordOld) {\n    var data = `${params.SMSPassword.SMSPasswordOld}loc`\n} else {\n    var data = `loc`\n}\nAddValue('data', data)\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":4,"Order":null},"CacheImei":false,"RegEx":"^(Now:Loc Time: |Ubicacin GPS:Tiempo de Loc: )[^)]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6913,"Code":"ACK-RBT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"{{reboot ok.|Reiniciar ok.}}","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":{"Id":4982,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"0.1","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":false},"Name":"actionDeviceReboot","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '12';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'reboot';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":13},"CacheImei":false,"RegEx":"^(reboot ok.|Reiniciar ok.)","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6913,\"Code\":\"ACK-RBT\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"{{reboot ok.|Reiniciar ok.}}\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":4982,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionDeviceReboot\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '12';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'reboot';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^(reboot ok.|Reiniciar ok.)\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797034}],"Tags":[]},{"Id":6911,"Code":"F-ACK-Invalid State","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB00030009D3<<sequenceNumber>>7F0123","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB00030009D3[^ ]*7F0123","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6909,"Code":"ZNO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"+RESP:ZOUT,<<imei>>,<<zone_name>>,<<latitude>>,<<longitude>>,<<location_accuracy>>,<<location_time>>,<<event_time>>,<<source>>$","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:ZOUT,[^,]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6908,"Code":"ZNI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"+RESP:ZIN,<<imei>>,<<zone_name>>,<<latitude>>,<<longitude>>,<<location_accuracy>>,<<location_time>>,<<event_time>>,<<source>>$","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:ZIN,[^,]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6907,"Code":"F-ACK-GPS Is Not Ready","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003008D93<<sequenceNumber>>7F0127","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003008D93[^ ]*7F0127","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6906,"Code":"F-ACK-Data Format Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003004BF3<<sequenceNumber>>7F0121","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003004BF3[^ ]*7F0121","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6904,"Code":"F-ACK-Key Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300DEA5<<sequenceNumber>>7F0117","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":"","LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300DEA5[^ ]*7F0117","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6903,"Code":"CHK-ASSO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview-ASSOCIATE;<<imei>>;<<guid>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Eview-ASSOCIATE;[^;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6903,\"Code\":\"CON-ASSO\",\"Name\":null,\"MessageCode\":\"CON\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Eview-ASSOCIATE;<<imei>>;<<guid>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":true,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Eview-ASSOCIATE;[^;]*;[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1749056501}],"Tags":[]},{"Id":6902,"Code":"RTL","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-RTL;<<imei>>;<<event_time>>;<<location_time>>;<<latitude>>;<<longitude>>;<<location_accuracy>>;<<altitude>>;<<speed>>;<<battery_percentage>>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-RTL;[^;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6900,"Code":"F-ACK-SubFunction Not Supported","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300AC83<<sequenceNumber>>7F0126","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300AC83[^ ]*7F0126","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6898,"Code":"ALA-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ALA-C;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALA-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6897,"Code":"ALF-C","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ALF-C;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALF-C;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6895,"Code":"ALF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"Roam-ALF;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6893,"Code":"BATCF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-BATCF;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-BATCF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6890,"Code":"COMM-SMS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-SMS;<<imei>>;<<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":"esendex<<phone>>esendex<<data>>","LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-SMS;[^;]*;[^;]*","RegExGlobal":"^esendex[^e]*esendex[^x]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6887,"Code":"NACT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"+RESP:NACT,<<imei>>,<<event_time>>$","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:NACT,[^,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6886,"Code":"BATCN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-BATCN;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-BATCN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6883,"Code":"ALA-O","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ALA-O;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALA-O;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6882,"Code":"ENC-2","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"","HasTemplateGlobal":true,"ResponseTemplate":"<<ack>>","TemplateGlobal":"AB00<<all_data>>","LongConnection":true,"HexString":true,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"","RegExGlobal":"^AB00[^ ]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6881,"Code":"RTL-BEACON","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Beacon:Loc Time: <<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Beacon:Loc Time: [^ ]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6879,"Code":"ENC","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":true,"NoOperation":false,"Type":0,"Template":"","HasTemplateGlobal":true,"ResponseTemplate":"<<ack>>","TemplateGlobal":"AB10<<all_data>>","LongConnection":true,"HexString":true,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"","RegExGlobal":"^AB10[^ ]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6878,"Code":"PWRN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-PWRN;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-PWRN;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6877,"Code":"PWRF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-PWRF;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-PWRF;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6876,"Code":"HRT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-HRT;<<imei>>;STATUS=<<status_data>>;ETIME=<<event_time>>;GENERAL=<<general>>;<<single_column_value>>;HRT=<<heart_rate>>;TLEVEL=<<trust_level>>;LABEL=<<oysta_labels>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6876,\"Code\":\"HRT\",\"Name\":null,\"MessageCode\":\"HRT\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-HRT;<<imei>>;STATUS=<<status_data>>;ETIME=<<event_time>>;GENERAL=<<general>>;<<single_column_value>>;HRT=<<heart_rate>>;TLEVEL=<<trust_level>>;LABEL=<<rawlabel>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-HRT;[^;]*;STATUS=[^;;]*;ETIME=[^;;]*;GENERAL=[^;;]*;[^;;]*;HRT=[^;;]*;TLEVEL=[^;;]*;LABEL=[^=]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797536}],"Tags":[]},{"Id":6874,"Code":"RTL-WIFI","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Wifi and GSM:Loc Time: <<data>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Wifi and GSM:Loc Time: [^ ]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6873,"Code":"F-ACK-Key Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300FFB5<<sequenceNumber>>7F0116","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300FFB5[^ ]*7F0116","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6872,"Code":"COMM-GT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview;<<imei>>;<<sequenceNumber>>;Get timestamp","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Eview;[^;]*;[^;;]*;Get timestamp","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6871,"Code":"F-ACK-Checksum Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300BD95<<sequenceNumber>>7F0114","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300BD95[^ ]*7F0114","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6870,"Code":"ACK-global","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB00030008C7<<sequenceNumber>>7F0100","HasTemplateGlobal":false,"ResponseTemplate":"<<ack_internal>>","TemplateGlobal":null,"LongConnection":true,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB00030008C7[^ ]*7F0100","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6869,"Code":"F-ACK-Length Error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003005AE5<<sequenceNumber>>7F0113","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003005AE5[^ ]*7F0113","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6868,"Code":"F-ACK-Encryption Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003007BF5<<sequenceNumber>>7F0112","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003007BF5[^ ]*7F0112","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6867,"Code":"F-ACK-Version Invalid","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB00030018C5<<sequenceNumber>>7F0111","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB00030018C5[^ ]*7F0111","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6866,"Code":"F-ACK-Address Resp","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003006262<<sequenceNumber>>7F0128","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003006262[^ ]*7F0128","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6863,"Code":"F-ACK-BLE Password","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB000300CC8F<<sequenceNumber>>7F0140","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB000300CC8F[^7;]*7F0140","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8054,"Code":"ALA-F","Name":null,"MessageCode":"ALA-F","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ALA-F;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8054,\"Code\":\"ALA-F\",\"Name\":null,\"MessageCode\":\"ALA-F\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ALA-F;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1757760305},{"Type":1,"NewValue":"{\"Id\":8054,\"Code\":\"ALA-F\",\"Name\":null,\"MessageCode\":\"ALA-F\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ALA-F;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ALA-F;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1757760355}],"Tags":[]},{"Id":8095,"Code":"F-ACK-Battery Power Low","Name":null,"MessageCode":"ACK","NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Eview-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Eview-ACK;[^;]*;AB0003001728[^ ]*7F01F0","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8095,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Eview-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Eview-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775042165},{"Type":1,"NewValue":"{\"Id\":8095,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775042380},{"Type":1,"NewValue":"{\"Id\":8095,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1778535461},{"Type":1,"NewValue":"{\"Id\":8095,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":1,\"Template\":\"Roam-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1778536044},{"Type":1,"NewValue":"{\"Id\":8095,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":true,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5816,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.7\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionTriggerOTA\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"// Trigger OTA\\r\\nvar configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//create value for URL  40.91.195.192:8098\\r\\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\\r\\n// http://40.91.195.192:8098/api/fi_ota  (test server)\\r\\n// production server 'http://13.81.174.129:8098/api/fi_ota';\\r\\nif (params.CommunicationSettings.Server === '52.232.85.255,5678') {\\r\\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\\r\\n} else {\\r\\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\\r\\n}\\r\\nvar value = ascii_to_hexa(value).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\n// control command\\r\\nvar command = '04';\\r\\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\\r\\nvar key = '30';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes;\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x !== 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin;\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780680224},{"Type":1,"NewValue":"{\"Id\":8095,\"Code\":\"F-ACK-Battery Power Low\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ACK;<<imei>>;AB0003001728<<sequenceNumber>>7F01F0\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":{\"Id\":5816,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"2.8\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionTriggerOTA\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"// Trigger OTA\\r\\nvar configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//create value for URL  40.91.195.192:8098\\r\\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\\r\\n// http://40.91.195.192:8098/api/fi_ota  (test server)\\r\\n// production server 'http://13.81.174.129:8098/api/fi_ota';\\r\\nif (params.CommunicationSettings.Server === '52.232.85.255,5678') {\\r\\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\\r\\n} else {\\r\\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\\r\\n}\\r\\nvar value = ascii_to_hexa(value).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\n// control command\\r\\nvar command = '04';\\r\\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\\r\\nvar key = '30';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes;\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x !== 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin;\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003001728[^ ]*7F01F0\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1781797353}],"Tags":[]},{"Id":8096,"Code":"F-ACK-Not Registered","Name":null,"MessageCode":"ACK","NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003007AE1<<sequenceNumber>>7F0131","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003007AE1[^ ]*7F0131","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8096,\"Code\":\"F-ACK-Not Registered\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ACK;<<imei>>;AB0003007AE1<<sequenceNumber>>7F0131\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003007AE1[^ ]*7F0131\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775042310}],"Tags":[]},{"Id":8097,"Code":"F-ACK-Out Of Service","Name":null,"MessageCode":"ACK","NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"Roam-ACK;<<imei>>;AB0003005BF1<<sequenceNumber>>7F0130","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-ACK;[^;]*;AB0003005BF1[^ ]*7F0130","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8097,\"Code\":\"F-ACK-Out Of Service\",\"Name\":null,\"MessageCode\":\"ACK\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":true,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"Roam-ACK;<<imei>>;AB0003005BF1<<sequenceNumber>>7F0130\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-ACK;[^;]*;AB0003005BF1[^ ]*7F0130\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1775042357}],"Tags":[]},{"Id":8308,"Code":"OBTL","Name":null,"MessageCode":"OBTL","NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"Roam-OBTL;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^Roam-OBTL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":8308,\"Code\":\"OBTL\",\"Name\":null,\"MessageCode\":\"OBTL\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":2,\"Template\":\"Roam-OBTL;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;<<single_column_value>>\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^Roam-OBTL;[^;]*;STATUS=[^;;]*;LTIME=[^;;]*;ETIME=[^;;]*;BATP=[^;;]*;LGPS=[^;;]*;LWIF=[^;;]*;LLBS=[^;;]*;LBEACON=[^;;]*;BLE=[^;;]*;GENERAL=[^;;]*;[^;]*\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1780680320}],"Tags":[]}],"Commands":[{"Id":5348,"Name":"setWifiList","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local WIFI Settings':\r\n//var params = {WiFiConnect:{'EnableDisableWiFiConnect':'false','SSID':'wifi_name','Password':'wifi_password'}}\r\n// Test  enabled\r\n// AB 10 1C 00 98 78 00 00 02 1A 4A 80 09 0D 77 69 66 69 5F 6E 61 6D 65 77 69 66 69 5F 70 61 73 73 77 6F 72 64 \r\n// test disabled\r\n// AB 10 06 00 71 04 01 00 02 04 4A 00 00 00    \r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar idsToUpdate = [];\r\nvar deletedId = [];\r\nvar notSend = false;\r\n// WiFi\r\nvar network = '';\r\nvar pass = '';\r\nvar bodyLength = '00';\r\nvar networkLength = '00';\r\nvar passLength = '00';\r\nvar dataSMS = '';\r\n// configuration command (0X02) WiFi Connect Network\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confWifi = '';\r\n//check if a number was deleted, and remove it from the list\r\nlet counter = 0;\r\nfor (var wifiChanged of paramsChanged.WiFiList) {\r\n    // update ids\r\n    var wifis = paramsChangedIds.WiFiList[counter];\r\n    for (var item in wifis) {\r\n        idsToUpdate.push(wifis[item]);\r\n    }\r\n    if (wifiChanged.Deleted === \"true\") {\r\n        deletedId.push(wifiChanged);\r\n    }\r\n    counter++;\r\n}\r\n//iterate over approved wifi networks, \r\ncounter = 0;\r\nfor (var wifi in params.WiFiList) {\r\n    confWifi = '8' + ('00' + decimalToHex(parseInt(wifi))).slice(-1).toUpperCase(); // Enable wifi index \r\n    if (deletedId.length > 0) {\r\n        if (checkValue(wifi) === true) {\r\n            confWifi = ('00' + decimalToHex(wifi)).slice(-2).toUpperCase(); // Add wifi index\r\n            value += `044A${confWifi}0000`; // No SSID, No password \r\n        } else {\r\n            if (params.WiFiList[wifi].SSID) {\r\n                network = ascii_to_hexa(params.WiFiList[wifi].SSID).toUpperCase();\r\n                networkLength = ('00' + decimalToHex(network.length / 2)).slice(-2).toUpperCase();\r\n            }\r\n            if (params.WiFiList[wifi].Password) {\r\n                pass = ascii_to_hexa(params.WiFiList[wifi].Password).toUpperCase();\r\n                passLength = ('00' + decimalToHex(pass.length / 2)).slice(-2).toUpperCase();\r\n            }\r\n            keyLength = ('00' + decimalToHex(4 + network.length / 2 + pass.length / 2)).slice(-2).toUpperCase();\r\n            // key 4A\r\n            value += keyLength + '4A' + confWifi + networkLength + passLength + network + pass;\r\n        }\r\n    } else {\r\n        if (params.WiFiList[wifi].SSID) {\r\n            network = ascii_to_hexa(params.WiFiList[wifi].SSID).toUpperCase();\r\n            networkLength = ('00' + decimalToHex(network.length / 2)).slice(-2).toUpperCase();\r\n        }\r\n        if (params.WiFiList[wifi].Password) {\r\n            pass = ascii_to_hexa(params.WiFiList[wifi].Password).toUpperCase();\r\n            passLength = ('00' + decimalToHex(pass.length / 2)).slice(-2).toUpperCase();\r\n        }\r\n        keyLength = ('00' + decimalToHex(4 + network.length / 2 + pass.length / 2)).slice(-2).toUpperCase();\r\n        // key 4A\r\n        value += keyLength + '4A' + confWifi + networkLength + passLength + network + pass;\r\n    }\r\n    counter++;\r\n}\r\n//disable other wifi networks\r\n// 02 04 4A 02 00 00\r\nfor (counter; counter < 5; counter++) {\r\n    confWifi = ('00' + decimalToHex(counter)).slice(-2).toUpperCase(); // Add wifi index\r\n    value += `044A${confWifi}0000`; // No SSID, No password \r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(value.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(value);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + value;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    idsToUpdate: idsToUpdate,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction checkValue(contact) {\r\n    for (var d in deletedId) {\r\n        if (params.WiFiList[contact].SSID == paramsChanged.WiFiList[d].SSID) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5346,"Name":"setWifiSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local WIFI Settings':\r\n//var params = {WiFiConnect:{'EnableDisableWiFiConnect':'false','SSID':'wifi_name','Password':'wifi_password'}}\r\n// Test  enabled\r\n// AB 10 1C 00 98 78 00 00 02 1A 4A 80 09 0D 77 69 66 69 5F 6E 61 6D 65 77 69 66 69 5F 70 61 73 73 77 6F 72 64 \r\n// test disabled\r\n// AB 10 06 00 71 04 01 00 02 04 4A 00 00 00            \r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) WiFi Connect Network\r\nvar messageBody = '02';\r\n// WiFi\r\nvar network = '';\r\nvar pass = '';\r\nvar bodyLength = '00';\r\nvar networkLength = '00';\r\nvar passLength = '00';\r\nvar dataSMS = '';\r\nif (params.WiFiSettings.EnableDisableWiFiSettings == 'true') {\r\n    if (params.WiFiSettings.SSID) {\r\n        network = ascii_to_hexa(params.WiFiSettings.SSID).toUpperCase();\r\n        networkLength = ('00' + decimalToHex(network.length / 2)).slice(-2).toUpperCase();\r\n    }\r\n    if (params.WiFiSettings.Password) {\r\n        pass = ascii_to_hexa(params.WiFiSettings.Password).toUpperCase();\r\n        passLength = ('00' + decimalToHex(pass.length / 2)).slice(-2).toUpperCase();\r\n    }\r\n    bodyLength = ('00' + decimalToHex(4 + network.length / 2 + pass.length / 2)).slice(-2).toUpperCase();\r\n    // key 4A and enable, not connected and index 0 = 80\r\n    messageBody += bodyLength + \"4A80\" + networkLength + passLength + network + pass;\r\n} else {\r\n    messageBody += '044A000000';\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5015,"Name":"getSystemSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '33'; //System settings - allow list\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data); // For GPRS command\r\nAddValue('sequenceNumber', sequenceID);\r\n//AddValueSMS('dataSMS', dataSMS); // For SMS command\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":5014,"Name":"getVolume","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar value = '34'; //10 Ring tone Volume\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":24,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5014,\"Name\":\"getVolume\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar value = '34'; //10 Ring tone Volume\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466203}],"Tags":[]},{"Id":5013,"Name":"setSystemSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '00000000000000000100'; // A1 phone monitor Enable as default documentation\r\nif (params.SystemSettings.AllowList == 'true') { // Enable SMS Whitelist Setting\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\n//if (params.PhoneSettings.SilentCallMode == 'true') {\r\n//    value += '1';\r\n//} else {\r\nvalue += '0';\r\n//}\r\n//if (params.PhoneSettings.ButtonHangUp == 'true') {\r\n//    value += '1';\r\n//} else {\r\nvalue += '1'; // ButtonHangUp Default True\r\n//}\r\nif (params.SystemSettings.AllowList == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.SystemSettings.AutoAnswer == 'true') {\r\n    value += '1';\r\n    //  if (params.PhoneSettings.AutoAnswerAfterRings) {\r\n    //        value += ('0000000' + decimalToBinary(parseInt(params.PhoneSettings.AutoAnswerAfterRings))).slice(-7);\r\n    //   } else {\r\n    value += ('0000011'); // default 3\r\n    // }\r\n} else {\r\n    value += '00000000';\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '33';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('')\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF)\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('')\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":3,"SendAttempts":3,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5013,\"Name\":\"setSystemSettings\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n// default value for Roam\\r\\n// [Length]:05 [Key]:33 [Value]:0A 03 01 00\\r\\n// {\\\"phoneOption\\\":{\\\"flag_value\\\":66314,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":0,\\\"s6\\\":0,\\\"callIncoming\\\":1,\\\"rings\\\":10,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":0,\\\"s2\\\":1}}\\r\\nvar value = '0A030100';\\r\\n/* create the bit table to use with control\\r\\nvar value = '00000000000000000100'; // A1 phone monitor Enable as default documentation\\r\\nif (params.SystemSettings.AllowList == 'true') { // Enable SMS Whitelist Setting\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\n//if (params.PhoneSettings.SilentCallMode == 'true') {\\r\\n//    value += '1';\\r\\n//} else {\\r\\nvalue += '0';\\r\\n//}\\r\\n//if (params.PhoneSettings.ButtonHangUp == 'true') {\\r\\n//    value += '1';\\r\\n//} else {\\r\\nvalue += '1'; // ButtonHangUp Default True\\r\\n//}\\r\\nif (params.SystemSettings.AllowList == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.SystemSettings.AutoAnswer == 'true') {\\r\\n    value += '1';\\r\\n    //  if (params.PhoneSettings.AutoAnswerAfterRings) {\\r\\n    //        value += ('0000000' + decimalToBinary(parseInt(params.PhoneSettings.AutoAnswerAfterRings))).slice(-7);\\r\\n    //   } else {\\r\\n    value += ('0000011'); // default 3\\r\\n    // }\\r\\n} else {\\r\\n    value += '00000000';\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value); */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '33';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('')\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF)\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('')\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":9,\"SendAttempts\":3,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760468301},{"Type":1,"NewValue":"{\"Id\":5013,\"Name\":\"setSystemSettings\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n// default value for Roam\\r\\n// [Length]:05 [Key]:33 [Value]:0A 03 01 00\\r\\n// {\\\"phoneOption\\\":{\\\"flag_value\\\":66314,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":0,\\\"s6\\\":0,\\\"callIncoming\\\":1,\\\"rings\\\":10,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":0,\\\"s2\\\":1}}\\r\\n//var value = '0A030100';  FOR CONVERSION - DEPRECATED\\r\\n// create the bit table to use with control\\r\\nvar value = '00000000000000000100'; // A1 phone monitor Enable as default documentation\\r\\nif (params.SystemSettings.AllowList == 'true') { // Enable SMS Whitelist Setting\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\n//if (params.PhoneSettings.SilentCallMode == 'true') {\\r\\n//    value += '1';\\r\\n//} else {\\r\\nvalue += '0';\\r\\n//}\\r\\n//if (params.PhoneSettings.ButtonHangUp == 'true') {\\r\\n//    value += '1';\\r\\n//} else {\\r\\nvalue += '1'; // ButtonHangUp Default True\\r\\n//}\\r\\nif (params.SystemSettings.AllowList == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.SystemSettings.AutoAnswer == 'true') {\\r\\n    value += '1';\\r\\n    //  if (params.PhoneSettings.AutoAnswerAfterRings) {\\r\\n    //        value += ('0000000' + decimalToBinary(parseInt(params.PhoneSettings.AutoAnswerAfterRings))).slice(-7);\\r\\n    //   } else {\\r\\n    value += ('0000011'); // default 3\\r\\n    // }\\r\\n} else {\\r\\n    value += '00000000';\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '33';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('')\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF)\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('')\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":9,\"SendAttempts\":3,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1771526487}],"Tags":[]},{"Id":5010,"Name":"getCustomId","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '47'; //Get device or custom id \r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":8,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5010,\"Name\":\"getCustomId\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '47'; //Get device or custom id \\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466093}],"Tags":[]},{"Id":5008,"Name":"getNoMotionAlert","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '53'; //No motion Alert code\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":7,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5008,\"Name\":\"getNoMotionAlert\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '53'; //No motion Alert code\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466148}],"Tags":[]},{"Id":5007,"Name":"getFallDownAlert","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '56'; //Fall down Alert code\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":8,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5007,\"Name\":\"getFallDownAlert\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '56'; //Fall down Alert code\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466112}],"Tags":[]},{"Id":5005,"Name":"getPerformanceMode","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar value = '44'; //time interval\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\n/* IMEI:863921033969786\r\nGSM signal quality: 15\r\nSoftware version: V07BX.8601.2109\r\nversion: V1.0.29.1 */\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":23,"SendAttempts":7,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5005,\"Name\":\"getPerformanceMode\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar value = '44'; //time interval\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\n/* IMEI:863921033969786\\r\\nGSM signal quality: 15\\r\\nSoftware version: V07BX.8601.2109\\r\\nversion: V1.0.29.1 */\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\n//var prefix = 'AB10' + '0B00' + checksum + sequenceID;\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":7,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466165}],"Tags":[]},{"Id":5004,"Name":"getSystemLanguage","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = '1F'; //System language - locale\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data); // For GPRS command\r\nAddValue('sequenceNumber', sequenceID);\r\n//AddValueSMS('dataSMS', dataSMS); // For SMS command\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":22,"SendAttempts":3,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":5004,\"Name\":\"getSystemLanguage\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '1F'; //System language - locale\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data); // For GPRS command\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n//AddValueSMS('dataSMS', dataSMS); // For SMS command\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":3,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466184}],"Tags":[]},{"Id":5003,"Name":"getHomeBeacon","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = ''; //get home beacon\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '09';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\n/* IMEI:863921033969786\r\nGSM signal quality: 15\r\nSoftware version: V07BX.8601.2109\r\nversion: V1.0.29.1 */\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":3,"ProtocolActionObjects":[],"Tags":[]},{"Id":5002,"Name":"getAuthorisedNumbers","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = ''; //get top 10 authorised numbers\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '09';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\n/* IMEI:863921033969786\r\nGSM signal quality: 15\r\nSoftware version: V07BX.8601.2109\r\nversion: V1.0.29.1 */\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0B00' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":3,"ProtocolActionObjects":[],"Tags":[]},{"Id":4918,"Name":"actionConfigurationMode","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n    var data = `GPRSHB1M`;\r\n} else {\r\n    var data = `GPRSHB0M`; //`GPRSHB240S`;\r\n}\r\nAddValue('data', data);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4918,\"Name\":\"actionConfigurationMode\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nif (params.Controls.ConfigurationMode == 'true') {\\r\\n    var data = `GPRSHB1M`;\\r\\n} else {\\r\\n    var data = `GPRSHB240S`; //`GPRSHB0M`;\\r\\n}\\r\\nAddValue('data', data);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734458640}],"Tags":[]},{"Id":4980,"Name":"setServerSMS","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar configsSMS = [];\r\nvar data = '';\r\nvar dataSMS = '';\r\nvar notSend = false;\r\nif (params.CommunicationSettings.Server) {\r\n    var serverString = params.CommunicationSettings.Server.split(',');\r\n    var domain = serverString[0];\r\n    var port = serverString[1];\r\n    dataSMS = `IP1,${domain},${port}`;\r\n    //if (params.SMSPassword.SMSPasswordOld) {\r\n    //    var data = `${params.SMSPassword.SMSPasswordOld}IP1,${domain},${port}`;\r\n    //} else {\r\n    //    var data = `IP1,${domain},${port}`;\r\n    //}\r\n}\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\nAddValue('data', data);\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4976,"Name":"setEmergencyNumberbySMS","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar configsSMS = [];\r\nvar data = '';\r\nvar dataSMS = '';\r\nvar notSend = false;\r\nif (params.EmergencySettings.EmergencyNumber) {\r\n    var phone_number = params.EmergencySettings.EmergencyNumber;\r\n    dataSMS = `A1,0,1,${phone_number}`;\r\n    //if (params.SMSPassword.SMSPasswordOld) {\r\n    //    var data = `${params.SMSPassword.SMSPasswordOld}IP1,${domain},${port}`;\r\n    //} else {\r\n    //    var data = `IP1,${domain},${port}`;\r\n    //}\r\n}\r\n// Reply from device \"Set contact number 1 ok.\"\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\nAddValue('data', data);\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4975,"Name":"setFallSensitivitybySMS","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar configsSMS = [];\r\nvar data = '';\r\nvar dataSMS = '';\r\nvar notSend = false;\r\nif (params.EmergencySettings.FallSensitivity) {\r\n    var sensitivity = parseInt(params.EmergencySettings.FallSensitivity);\r\n    dataSMS = `FL1,${sensitivity},1`;\r\n}\r\n// Reply from device \"Set fall down alarm ok!\"\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\nAddValue('data', data);\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4940,"Name":"setBeacons","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local Beacon':\r\n//AB10C800F6640902021F73805F03002160C000000000000000004556303642617365436861726765721E73817016BAE84BF50000000000000000456E74726164614F666963696E6110730200000000000000000000000000001073030000000000000000000000000000107304000000000000000000000000000010730500000000000000000000000000001073060000000000000000000000000000107307000000000000000000000000000010730800000000000000000000000000001073090000000000000000000000000000//var params = {'HomeBeacon': [{'Beacon':'EV06 Base Charger,1C0:60:21:00:03:5F','Name':'Beacon1'},{'Beacon':'EntradaOficina,F5:4B:E8:BA:16:70','Name':'Beacon2'} ]};\r\n//var params = {'HomeBeacon': {'BeaconName': [{'Number':'1','Name':'Contact1'},{'Number':'2','Name':'Contact2'} ]}};\r\nvar configs = [];\r\nvar idsToUpdate = [];\r\nvar deletedId = []\r\nvar counter = 0;\r\nvar notSend = false;\r\nvar numberLength = '00';\r\nvar numberHex = ''; // MAC\r\nvar nameLength = '00';\r\nvar nameHex = ''; // Description\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = ''; // for index and enable//disable\r\nvar beaconString = '';\r\nvar beacon_name = '';\r\nvar beacon_mac = '';\r\nfor (var contactChanged of paramsChanged.BeaconList) {\r\n    var contacts = paramsChangedIds.BeaconList[counter]; //counter\r\n    for (var item in contacts) {\r\n        idsToUpdate.push(contacts[item]);\r\n    }\r\n    if (contactChanged.Deleted === \"true\") {\r\n        deletedId.push(contactChanged);\r\n        //    confTel = ('00' + decimalToHex(contactChanged)).slice(-2).toUpperCase(); // Add beacon number\r\n        //    value += \"1073\" + confTel + '0000000000000000000000000000'; //no name, mac nor lat//long\r\n    }\r\n    //counter++;\r\n}\r\n//var index = params.BeaconList.length;\r\nfor (var contact in params.BeaconList) {\r\n    //console.log(parseInt(contact)+1);\r\n    confTel = '8' + ('00' + decimalToHex(parseInt(contact))).slice(-1).toUpperCase(); // Add contact for the index\r\n    if (deletedId.length > 0) {\r\n        if (checkValue(contact) === true) {\r\n            confTel = ('00' + decimalToHex(contact)).slice(-2).toUpperCase(); // Add beacon number\r\n            value += \"1073\" + confTel + '0000000000000000000000000000'; //no name, mac nor lat//long\r\n        } else {\r\n            if (params.BeaconList[contact].Beacon !== null) {\r\n                // name, mac, major, minor\r\n                beaconString = params.BeaconList[contact].Beacon.split(',');\r\n                beacon_name = ascii_to_hexa(beaconString[0].replace(/\\s+/g, '')).toUpperCase();\r\n                beacon_mac = beaconString[1].replace(/:/g, '');\r\n                beacon_mac = changeEndianness(beacon_mac);\r\n            } else {\r\n                beaconString = 'empty,00:00:00:00:00:00';\r\n                beaconString = beaconString.split(',');\r\n                beacon_name = ascii_to_hexa(beaconString[0].replace(/\\s+/g, '')).toUpperCase();\r\n                beacon_mac = beaconString[1].replace(/:/g, '');\r\n            }\r\n            //let beacon_major = beaconString[2];\r\n            //let beacon_minor = beaconString[3];\r\n            //numberHex = ascii_to_hexa(params.HomeBeacon[contact].Beacon).toUpperCase();\r\n            //numberLength = ('00' + decimalToHex(params.HomeBeacon[contact].Beacon.length)).slice(-2).toUpperCase();\r\n            //nameHex = ascii_to_hexa(params.HomeBeacon[contact].Name).toUpperCase();\r\n            //nameLength = ('00' + decimalToHex(params.HomeBeacon[contact].Name.length)).slice(-2).toUpperCase();\r\n            //keyLength = ('00' + decimalToHex(5 + params.HomeBeacon[contact].Beacon.length + params.HomeBeacon[contact].Name.length)).slice(-2).toUpperCase();\r\n            keyLength = ('00' + decimalToHex(16 + (beacon_name.length / 2))).slice(-2).toUpperCase();\r\n            value += keyLength + \"73\" + confTel + beacon_mac + '0000000000000000' + beacon_name; //no lat long\r\n        }\r\n    } else {\r\n        if (params.BeaconList[contact].Beacon !== null) {\r\n            // name, mac, major, minor\r\n            beaconString = params.BeaconList[contact].Beacon.split(',');\r\n            beacon_name = ascii_to_hexa(beaconString[0].replace(/\\s+/g, '')).toUpperCase();\r\n            beacon_mac = beaconString[1].replace(/:/g, '');\r\n            beacon_mac = changeEndianness(beacon_mac);\r\n        } else {\r\n            beaconString = 'empty,00:00:00:00:00:00';\r\n            beaconString = beaconString.split(',');\r\n            beacon_name = ascii_to_hexa(beaconString[0].replace(/\\s+/g, '')).toUpperCase();\r\n            beacon_mac = beaconString[1].replace(/:/g, '');\r\n        }\r\n        //let beacon_major = beaconString[2];\r\n        //let beacon_minor = beaconString[3];\r\n        //numberHex = ascii_to_hexa(params.HomeBeacon[contact].Beacon).toUpperCase();\r\n        //numberLength = ('00' + decimalToHex(params.HomeBeacon[contact].Beacon.length)).slice(-2).toUpperCase();\r\n        //nameHex = ascii_to_hexa(params.HomeBeacon[contact].Name).toUpperCase();\r\n        //nameLength = ('00' + decimalToHex(params.HomeBeacon[contact].Name.length)).slice(-2).toUpperCase();\r\n        //keyLength = ('00' + decimalToHex(5 + params.HomeBeacon[contact].Beacon.length + params.HomeBeacon[contact].Name.length)).slice(-2).toUpperCase();\r\n        keyLength = ('00' + decimalToHex(16 + (beacon_name.length / 2))).slice(-2).toUpperCase();\r\n        value += keyLength + \"73\" + confTel + beacon_mac + '0000000000000000' + beacon_name; //no lat long\r\n        //index = index - 1;\r\n    }\r\n    counter++;\r\n}\r\n//disable other beacons\r\n// 10 73 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00\r\nfor (counter; counter < 10; counter++) {\r\n    confTel = ('00' + decimalToHex(counter)).slice(-2).toUpperCase(); // Add beacon number\r\n    value += \"1073\" + confTel + '0000000000000000000000000000'; //no name, mac nor lat//long\r\n}\r\n//for (var contactChanged of paramsChanged.BeaconList) {\r\n//    var contacts = paramsChangedIds.BeaconList[counter];\r\n//    for (var item in contacts) {\r\n//        idsToUpdate.push(contacts[item]);\r\n//    }\r\n//if (contactChanged.Deleted === \"true\") {\r\n//    var cadena = contactChanged.Name + \":\" + contactChanged.Number + ',';\r\n//    command = command.replace(cadena, '');\r\n//}\r\n//    counter++;\r\n//}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(value.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(value);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + value;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    idsToUpdate: idsToUpdate,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction checkValue(contact) {\r\n    for (var d in deletedId) {\r\n        if (params.BeaconList[contact].Beacon == paramsChanged.BeaconList[d].Beacon) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4978,"Name":"setAPNSMS","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar configsSMS = [];\r\nvar data = '';\r\nvar dataSMS = '';\r\nvar notSend = false;\r\nif (params.CommunicationSettings.APN) {\r\n    var apnString = params.CommunicationSettings.APN.split(',');\r\n    var apn = apnString[0];\r\n    var apn_username = apnString[1];\r\n    var apn_password = apnString[2];\r\n    dataSMS = `S1,${apn},${apn_username},${apn_password}`;\r\n    //if (params.SMSPassword.SMSPasswordOld) {\r\n    //    data = `${params.SMSPassword.SMSPasswordOld}S1,${apn},${apn_username},${apn_password}`;\r\n    //} else {\r\n    //    data = `S1,${apn},${apn_username},${apn_password}`;\r\n    //}\r\n}\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\nAddValue('data', data);\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4968,"Name":"getCurrentSettings2","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'status'; // Check fall sens (function settings)\r\n/* Mode:4,0 second\r\nLED: on\r\nBeep: on\r\nVibration: on\r\nTime zone: +10:00\r\nGEO Fence:0,0,0,0\r\nMotion alarm: off\r\nNo Motion alarm: off\r\nTilt alert: off\r\nFall alarm: on, level:5\r\nLow power alarm: on,15%\r\nSOS Call:10 minutes, loop:1  */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":18,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4968,\"Name\":\"getCurrentSettings2\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'status'; // Check fall sens (function settings)\\r\\n/* Mode:4,0 second\\r\\nLED: on\\r\\nBeep: on\\r\\nVibration: on\\r\\nTime zone: +10:00\\r\\nGEO Fence:0,0,0,0\\r\\nMotion alarm: off\\r\\nNo Motion alarm: off\\r\\nTilt alert: off\\r\\nFall alarm: on, level:5\\r\\nLow power alarm: on,15%\\r\\nSOS Call:10 minutes, loop:1  */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":{\"Id\":4958,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"0.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":false},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '214A1A3440414243567356101F4453473330';\\r\\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '13';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":18,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733390363}],"Tags":[]},{"Id":4919,"Name":"actionFindDevice","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar key = '13';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/*  Answer from the device\r\n (no reply)\r\n*/\r\nvar dataSMS = 'findme';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":12,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4919,\"Name\":\"actionFindDevice\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar key = '13';\\r\\nvar totalLenght = '0300';\\r\\nvar keyLength = '01';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\n/*  Answer from the device\\r\\n (no reply)\\r\\n*/\\r\\nvar dataSMS = 'findme';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465939}],"Tags":[]},{"Id":4984,"Name":"setSMSPrefix","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nif (params.SMSPrefix.SMSPrefix == 'true') { //Enable Prefix for SMS anwers\r\n    if (params.SMSPassword.SMSPasswordOld) {\r\n        var data = `${params.SMSPassword.SMSPasswordOld}Prefix1,Rio-${serverParams.Imei}-`;\r\n    } else {\r\n        var data = `Prefix1,Rio-${serverParams.Imei}-`;\r\n    }\r\n} else {\r\n    var data = `Prefix0,`; //Disable Prefix for SMS anwers\r\n}\r\nAddValue('data', data);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4983,"Name":"actionRequestLocation","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nif (params.SMSPassword.SMSPasswordOld) {\n    var data = `${params.SMSPassword.SMSPasswordOld}loc`\n} else {\n    var data = `loc`\n}\nAddValue('data', data)\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4982,"Name":"actionDeviceReboot","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '12';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'reboot';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":13,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4982,\"Name\":\"actionDeviceReboot\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '12';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'reboot';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":13,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734006832},{"Type":1,"NewValue":"{\"Id\":4982,\"Name\":\"actionDeviceReboot\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '12';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'reboot';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465905}],"Tags":[]},{"Id":4981,"Name":"actionFactoryReset","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nvar configsSMS = [];\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '04';\nvar keyLength = '01';\nvar key = '11';\nvar messageBody = command + keyLength + key;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\nvar data = prefix + messageBody;\n// For GPRS command\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\n// For SMS command\nvar dataSMS = 'ineedtoresetEV-06A!';\nAddValueSMS('dataSMS', dataSMS);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs,\n    configsSMS: configsSMS\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configsSMS.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":15,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4981,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'ineedtoresetEV-06A!';\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs,\\n    configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733955479},{"Type":1,"NewValue":"{\"Id\":4981,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'ineedtoresetEV04!';\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs,\\n    configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":15,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734595853},{"Type":1,"NewValue":"{\"Id\":4981,\"Name\":\"actionFactoryReset\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar configsSMS = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '04';\\nvar keyLength = '01';\\nvar key = '11';\\nvar messageBody = command + keyLength + key;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\n// For SMS command\\nvar dataSMS = 'ineedtoresetEV04!';\\nAddValueSMS('dataSMS', dataSMS);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs,\\n    configsSMS: configsSMS\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configsSMS.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465925}],"Tags":[]},{"Id":4979,"Name":"setGatewayNumberbySMS","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar configsSMS = [];\r\nvar data = '';\r\nvar dataSMS = '';\r\nvar notSend = false;\r\nif (params.CommunicationSettings.SMSGateway) {\r\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\r\n    var gateway_name = gatewayString[1];\r\n    var gateway_number = gatewayString[0];\r\n    dataSMS = `A10,1,0,${gateway_number}`;\r\n    //if (params.SMSPassword.SMSPasswordOld) {\r\n    //    var data = `${params.SMSPassword.SMSPasswordOld}IP1,${domain},${port}`;\r\n    //} else {\r\n    //    var data = `IP1,${domain},${port}`;\r\n    //}\r\n}\r\n// Reply from device \"Set contact number 10 ok.\"\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\nAddValue('data', data);\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4977,"Name":"setPerformanceMode","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//Añadir comando para poner modo6 ??\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar command = '02';\r\nvar keyLength = '0D';\r\nvar key = '44'; // Time interval command\r\nvar cycleInterval = 60;\r\nvar lazyCycleInterval = 60;\r\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240  F0000080;  \r\nvar selectedMode = '2'; // Balanced mode\r\nif (params.PerformanceSettings.Mode) {\r\n    selectedMode = params.PerformanceSettings.Mode;\r\n}\r\nvar value = '000000'; // Time interval to zero\r\nswitch (selectedMode) {\r\n    case '0': // No reporting\r\n        cycleInterval = 86400; // Time interval to 24 hrs        \r\n        lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs        \r\n        // HB = 0\r\n        break;\r\n    case '1': //Power Saving\r\n        cycleInterval = 28800; // Time interval to 8 hrs        \r\n        lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs     \r\n        // HB = 0\r\n        break;\r\n    case '2': //Balanced\r\n        cycleInterval = 600; // Time interval to 10 min            \r\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs     \r\n        heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\r\n        break;\r\n    case '3': //High Freq\r\n        cycleInterval = 240; // Time interval to 4 min                       \r\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\r\n        heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \r\n        break;\r\n    default:\r\n        var value = '000000'; // Time interval to zero\r\n        //var valueSMS = '';\r\n}\r\n//Sms Value\r\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\r\nvar value = parseInt(cycleInterval);\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n    heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\r\n} // else {\r\n//   var heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240  F0000080;  \r\n//}\r\nvalue = decimalToHex(value);\r\nvalue = ('000000' + value).slice(-6).toUpperCase();\r\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\r\nvar valueLazy = parseInt(lazyCycleInterval);\r\nvar valueLazy = decimalToHex(valueLazy);\r\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\r\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'mode6' + valueSMS;\r\nAddValueSMS('dataSMS', dataSMS);\r\n//debug(data);\r\n//debug(dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4977,\"Name\":\"setPerformanceMode\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//Añadir comando para poner modo6 ??\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar command = '02';\\r\\nvar keyLength = '0D';\\r\\nvar key = '44'; // Time interval command\\r\\nvar cycleInterval = 60;\\r\\nvar lazyCycleInterval = 60;\\r\\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240  F0000080;  \\r\\nvar selectedMode = '2'; // Balanced mode\\r\\nif (params.PerformanceSettings.Mode) {\\r\\n    selectedMode = params.PerformanceSettings.Mode;\\r\\n}\\r\\nvar value = '000000'; // Time interval to zero\\r\\nswitch (selectedMode) {\\r\\n    case '0': // No reporting\\r\\n        cycleInterval = 86400; // Time interval to 24 hrs        \\r\\n        lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs        \\r\\n        // HB = 0\\r\\n        break;\\r\\n    case '1': //Power Saving\\r\\n        cycleInterval = 28800; // Time interval to 8 hrs        \\r\\n        lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs     \\r\\n        // HB = 0\\r\\n        break;\\r\\n    case '2': //Balanced\\r\\n        cycleInterval = 600; // Time interval to 10 min            \\r\\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs     \\r\\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\\r\\n        break;\\r\\n    case '3': //High Freq\\r\\n        cycleInterval = 240; // Time interval to 4 min                       \\r\\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\\r\\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \\r\\n        break;\\r\\n    default:\\r\\n        var value = '000000'; // Time interval to zero\\r\\n        //var valueSMS = '';\\r\\n}\\r\\n//Sms Value\\r\\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\\r\\nvar value = parseInt(cycleInterval);\\r\\nif (params.Controls.ConfigurationMode == 'true') {\\r\\n    heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\\r\\n} else {\\r\\n    heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240;  \\r\\n}\\r\\nvalue = decimalToHex(value);\\r\\nvalue = ('000000' + value).slice(-6).toUpperCase();\\r\\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\\r\\nvar valueLazy = parseInt(lazyCycleInterval);\\r\\nvar valueLazy = decimalToHex(valueLazy);\\r\\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\\r\\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\n//How to calculate sequenceID\\r\\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'mode6' + valueSMS;\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\n//debug(data);\\r\\n//debug(dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734459146},{"Type":1,"NewValue":"{\"Id\":4977,\"Name\":\"setPerformanceMode\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//Añadir comando para poner modo6 ??\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar command = '02';\\r\\nvar keyLength = '0D';\\r\\nvar key = '44'; // Time interval command\\r\\nvar cycleInterval = 60;\\r\\nvar lazyCycleInterval = 60;\\r\\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240  F0000080;  \\r\\nvar selectedMode = '2'; // Balanced mode\\r\\nif (params.PerformanceSettings.Mode) {\\r\\n    selectedMode = params.PerformanceSettings.Mode;\\r\\n}\\r\\nvar value = '000000'; // Time interval to zero\\r\\nswitch (selectedMode) {\\r\\n    case '0': // No reporting\\r\\n        cycleInterval = 86400; // Time interval to 24 hrs        \\r\\n        lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs        \\r\\n        // HB = 0\\r\\n        break;\\r\\n    case '1': //Power Saving\\r\\n        cycleInterval = 28800; // Time interval to 8 hrs        \\r\\n        lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs     \\r\\n        // HB = 0\\r\\n        break;\\r\\n    case '2': //Balanced\\r\\n        cycleInterval = 600; // Time interval to 10 min            \\r\\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs     \\r\\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\\r\\n        break;\\r\\n    case '3': //High Freq\\r\\n        cycleInterval = 240; // Time interval to 4 min                       \\r\\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\\r\\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \\r\\n        break;\\r\\n    default:\\r\\n        var value = '000000'; // Time interval to zero\\r\\n        //var valueSMS = '';\\r\\n}\\r\\n//Sms Value\\r\\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\\r\\nvar value = parseInt(cycleInterval);\\r\\nif (params.Controls.ConfigurationMode == 'true') {\\r\\n    heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\\r\\n} else {\\r\\n    heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240;  \\r\\n}\\r\\nvalue = decimalToHex(value);\\r\\nvalue = ('000000' + value).slice(-6).toUpperCase();\\r\\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\\r\\nvar valueLazy = parseInt(lazyCycleInterval);\\r\\nvar valueLazy = decimalToHex(valueLazy);\\r\\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\\r\\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\n//How to calculate sequenceID\\r\\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'mode6' + valueSMS;\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\n//debug(data);\\r\\n//debug(dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":7,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760467724}],"Tags":[]},{"Id":4974,"Name":"setRingToneVolume","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nif (params.SystemSettings.Volume) {\n    var volume = parseInt(params.SystemSettings.Volume);\n    volume = decimalToHex(parseInt(volume));\n    volume = ('00' + volume).slice(-2);\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '02';\nvar key = '10';\nvar messageBody = command + keyLength + key + volume;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID   // change to AB10 from AB18\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\n//var commandConfigs = {\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4973,"Name":"setSpeakerVolume","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.SystemSettings.Volume) {\n    var volume = parseInt(params.SystemSettings.Volume)\n    volume = decimalToHex(volume)\n    volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '12'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4972,"Name":"setAlarmClock1","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.AlarmClock1.EnableDisableAlarmClock1 == 'true') {\n    var index = '80';\n    if (params.AlarmClock1.Time) {\n        var hour = params.AlarmClock1.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(0, 2)\n        hour = parseInt(hour)\n        hour = decimalToHex(hour)\n        hour = ('00' + hour).slice(-2).toUpperCase()\n        var min = params.AlarmClock1.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(2, 4)\n        min = parseInt(min)\n        min = decimalToHex(min)\n        min = ('00' + min).slice(-2).toUpperCase()\n    } else {\n        var hour = '0C'; // default time 12:00\n        var min = '00';\n    }\n    //create the bit table to use with workdays\n    var workday = 0\n    if (params.AlarmClock1.Monday == 'true') {\n        workday += 1\n    }\n    if (params.AlarmClock1.Tuesday == 'true') {\n        workday += 2\n    }\n    if (params.AlarmClock1.Wednesday == 'true') {\n        workday += 4\n    }\n    if (params.AlarmClock1.Thursday == 'true') {\n        workday += 8\n    }\n    if (params.AlarmClock1.Friday == 'true') {\n        workday += 16\n    }\n    if (params.AlarmClock1.Saturday == 'true') {\n        workday += 32\n    }\n    if (params.AlarmClock1.Sunday == 'true') {\n        workday += 64\n    }\n    workday = decimalToHex(workday).toUpperCase()\n    workday = ('00' + workday).slice(-2).toUpperCase()\n    if (params.AlarmClock1.Duration) {\n        var duration = params.AlarmClock1.Duration\n        duration = decimalToHex(parseInt(duration)).toUpperCase()\n        duration = ('00' + duration).slice(-2).toUpperCase()\n    } else {\n        var duration = '1E';\n    }\n    var ring = '01'\n    var value = index + hour + min + workday + duration + ring\n} else {\n    value = '000000000101'\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '07'\nvar key = '0B'\nvar messageBody = command + keyLength + key + value\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\nvar prefix = 'AB10' + '0900' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4971,"Name":"actionPowerOff","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '14';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'off';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":14,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4971,\"Name\":\"actionPowerOff\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '14';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'off';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":14,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733955031},{"Type":1,"NewValue":"{\"Id\":4971,\"Name\":\"actionPowerOff\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '14';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'off';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465956}],"Tags":[]},{"Id":4970,"Name":"setNoDisturb","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nif (params.DoNotDisturb.EnableDisableNoDisturb == 'true') {\n    var flag = '80';\n    if (params.DoNotDisturb.Start) {\n        var hourStart = params.DoNotDisturb.Start.replace(/[^a-zA-Z0-9]/g, \"\").substring(0, 2);\n        hourStart = parseInt(hourStart);\n        hourStart = decimalToHex(hourStart);\n        hourStart = ('00' + hourStart).slice(-2).toUpperCase();\n        var minStart = params.DoNotDisturb.Start.replace(/[^a-zA-Z0-9]/g, \"\").substring(2, 4);\n        minStart = parseInt(minStart);\n        minStart = decimalToHex(minStart);\n        minStart = ('00' + minStart).slice(-2).toUpperCase();\n    }\n    if (params.DoNotDisturb.End) {\n        var hourEnd = params.DoNotDisturb.End.replace(/[^a-zA-Z0-9]/g, \"\").substring(0, 2);\n        hourEnd = parseInt(hourEnd);\n        hourEnd = decimalToHex(hourEnd);\n        hourEnd = ('00' + hourEnd).slice(-2).toUpperCase();\n        var minEnd = params.DoNotDisturb.End.replace(/[^a-zA-Z0-9]/g, \"\").substring(2, 4);\n        minEnd = parseInt(minEnd);\n        minEnd = decimalToHex(minEnd);\n        minEnd = ('00' + minEnd).slice(-2).toUpperCase();\n    }\n} else {\n    var flag = '00';\n    var hourStart, hourEnd, minStart, minEnd;\n    hourStart = hourEnd = minStart = minEnd = '00';\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '06';\nvar key = '0C';\nvar messageBody = command + keyLength + key + flag + hourStart + minStart + hourEnd + minEnd;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0800' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4969,"Name":"actionDeleteRecords","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '04';\r\nvar keyLength = '01';\r\nvar key = '10';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'flush';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":9,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4969,\"Name\":\"actionDeleteRecords\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '04';\\r\\nvar keyLength = '01';\\r\\nvar key = '10';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum).toUpperCase();\\r\\nchecksum = ('0000' + checksum).slice(-4);\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + '0300' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'flush';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465888}],"Tags":[]},{"Id":4967,"Name":"getAPN","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar value = '40'; //Ask for APN\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4966,"Name":"getServer","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar value = '43'; //Ask for Server\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4965,"Name":"actionTrace","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '01';\r\nvar key = '13';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/*  Answer from the device\r\nSet live tracking every 10 seconds and last for 10 minutes ok.\r\n*/\r\nvar dataSMS = 'CL10s,600s'; // CL(interval),(duration)\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":3,"HasAck":true,"HexString":true,"Order":11,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4965,\"Name\":\"actionTrace\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '01';\\r\\nvar key = '13';\\r\\nvar totalLenght = '0300';\\r\\nvar keyLength = '01';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\n/*  Answer from the device\\r\\nSet live tracking every 10 seconds and last for 10 minutes ok.\\r\\n*/\\r\\nvar dataSMS = 'CL10s,600s'; // CL(interval),(duration)\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":3,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465992}],"Tags":[]},{"Id":4964,"Name":"actionRealTimeLocation","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '01';\r\nvar key = '12';\r\nvar totalLenght = '0300';\r\nvar keyLength = '01';\r\nvar messageBody = command + keyLength + key;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\n/*  Answer from the device\r\nGPS Loc!\r\nNow:\r\nLoc Time:07/04/2021 17:36:44\r\nSpeed:0km/h\r\nAltitude:97.0\r\nBattery:57%\r\nwww.google.com/maps?q=22.6537233,114.0006070\r\n*/\r\nvar dataSMS = 'loc';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":10,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4964,\"Name\":\"actionRealTimeLocation\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '01';\\r\\nvar key = '12';\\r\\nvar totalLenght = '0300';\\r\\nvar keyLength = '01';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\n/*  Answer from the device\\r\\nGPS Loc!\\r\\nNow:\\r\\nLoc Time:07/04/2021 17:36:44\\r\\nSpeed:0km/h\\r\\nAltitude:97.0\\r\\nBattery:57%\\r\\nwww.google.com/maps?q=22.6537233,114.0006070\\r\\n*/\\r\\nvar dataSMS = 'loc';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":10,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733954911},{"Type":1,"NewValue":"{\"Id\":4964,\"Name\":\"actionRealTimeLocation\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '01';\\r\\nvar key = '12';\\r\\nvar totalLenght = '0300';\\r\\nvar keyLength = '01';\\r\\nvar messageBody = command + keyLength + key;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\n/*  Answer from the device\\r\\nGPS Loc!\\r\\nNow:\\r\\nLoc Time:07/04/2021 17:36:44\\r\\nSpeed:0km/h\\r\\nAltitude:97.0\\r\\nBattery:57%\\r\\nwww.google.com/maps?q=22.6537233,114.0006070\\r\\n*/\\r\\nvar dataSMS = 'loc';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760465971}],"Tags":[]},{"Id":4963,"Name":"setAPN","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local APN':\r\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\r\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\r\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) APN and Server and Gateway Number\r\nvar messageBody = '02';\r\n// Server\r\nvar domain = '';\r\nvar port = '';\r\nvar serverLength = '00';\r\n// APN\r\nvar apn = '';\r\nvar apn_password = '';\r\nvar apn_username = '';\r\nvar apnLength = '00';\r\nvar apnUserLength = '00';\r\nvar apnPassLength = '00';\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.Server) {\r\n    var serverString = params.CommunicationSettings.Server.split(',');\r\n    domain = serverString[0];\r\n    port = serverString[1];\r\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\r\n    // Server IP and Port\r\n    domain = ascii_to_hexa(domain).toUpperCase();\r\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\r\n    // key 43 and TCP and GPRS is 80\r\n    messageBody += serverLength + \"4380\" + port + domain;\r\n}\r\nif (params.CommunicationSettings.APN) {\r\n    var apnString = params.CommunicationSettings.APN.split(',');\r\n    // APN\r\n    apn = apnString[0];\r\n    apn = ascii_to_hexa(apn).toUpperCase();\r\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnLength + \"40\" + apn;\r\n    // APN username\r\n    apn_username = apnString[1];\r\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\r\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnUserLength + \"41\" + apn_username;\r\n    // APN passwprd\r\n    apn_password = apnString[2];\r\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\r\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnPassLength + \"42\" + apn_password;\r\n    // For SMS\r\n    dataSMS = `S1,${apnString[0]},${apnString[1]},${apnString[2]}`;\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":0,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4963,\"Name\":\"setAPN\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//para pruebas en local APN':\\r\\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\\r\\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\\r\\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02) APN and Server and Gateway Number\\r\\nvar messageBody = '02';\\r\\n// Server\\r\\nvar domain = '';\\r\\nvar port = '';\\r\\nvar serverLength = '00';\\r\\n// APN\\r\\nvar apn = '';\\r\\nvar apn_password = '';\\r\\nvar apn_username = '';\\r\\nvar apnLength = '00';\\r\\nvar apnUserLength = '00';\\r\\nvar apnPassLength = '00';\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.Server) {\\r\\n    var serverString = params.CommunicationSettings.Server.split(',');\\r\\n    domain = serverString[0];\\r\\n    port = serverString[1];\\r\\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\\r\\n    // Server IP and Port\\r\\n    domain = ascii_to_hexa(domain).toUpperCase();\\r\\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\\r\\n    // key 43 and TCP and GPRS is 80\\r\\n    messageBody += serverLength + \\\"4380\\\" + port + domain;\\r\\n}\\r\\nif (params.CommunicationSettings.APN) {\\r\\n    var apnString = params.CommunicationSettings.APN.split(',');\\r\\n    // APN\\r\\n    apn = apnString[0];\\r\\n    apn = ascii_to_hexa(apn).toUpperCase();\\r\\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnLength + \\\"40\\\" + apn;\\r\\n    // APN username\\r\\n    apn_username = apnString[1];\\r\\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\\r\\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnUserLength + \\\"41\\\" + apn_username;\\r\\n    // APN passwprd\\r\\n    apn_password = apnString[2];\\r\\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\\r\\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnPassLength + \\\"42\\\" + apn_password;\\r\\n    // For SMS\\r\\n    dataSMS = `S1,${apnString[0]},${apnString[1]},${apnString[2]}`;\\r\\n}\\r\\n// create HEADER\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":1,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761679005}],"Tags":[]},{"Id":4962,"Name":"setEmergencySettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '30';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n    phone_number = params.AlertSettings.EmergencyNumber;\r\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\n    messageBody += sosKeyLength + key + confSOS + numberHex;\r\n    dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000';  //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":3,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4962,\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    phone_number = params.AlertSettings.EmergencyNumber;\\r\\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":5,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466935}],"Tags":[]},{"Id":4961,"Name":"setFallSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02)  Fall sensitivity\r\nvar messageBody = '02';\r\nvar sensitivity = '';\r\nvar dataSMS = '';\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n    value += '1'\r\n    value += '100' //Dial\r\n    //}\r\n    if (params.FallSettings.Sensitivity) {\r\n        var sensiString = params.FallSettings.Sensitivity.split(',');\r\n        var level = sensiString[1];\r\n        sensitivity = parseInt(sensiString[0]);\r\n        // For SMS\r\n        dataSMS = `FL1,${sensitivity},1`;\r\n        //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\r\n        sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n        value += sensitivity\r\n    }\r\n} else {\r\n    value = '00000000'\r\n    dataSMS = `FL0,1,1`;\r\n}\r\n// create HEADER\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\r\nvar command = '02'\r\nvar keyLength = '02'\r\nvar key = '56'\r\nvar messageBody = command + keyLength + key + value\r\nvar checksum = byteStringToByteArray(messageBody)\r\nchecksum = crc16byte(checksum)\r\nchecksum = decimalToHex(checksum)\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\r\nchecksum = changeEndianness(checksum)\r\n//Hpw to calculate sequenceID\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\r\nvar data = prefix + messageBody\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":4,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4961,\"Name\":\"setFallSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02)  Fall sensitivity\\r\\nvar messageBody = '02';\\r\\nvar sensitivity = '';\\r\\nvar dataSMS = '';\\r\\nvar value = ''\\r\\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\\r\\n    value += '1'\\r\\n    value += '100' //Dial\\r\\n    //}\\r\\n    if (params.FallSettings.Sensitivity) {\\r\\n        var sensiString = params.FallSettings.Sensitivity.split(',');\\r\\n        var level = sensiString[1];\\r\\n        sensitivity = parseInt(sensiString[0]);\\r\\n        // For SMS\\r\\n        dataSMS = `FL1,${sensitivity},1`;\\r\\n        //numberHex = ascii_to_hexa(sensitivity).toUpperCase();\\r\\n        sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\\r\\n        value += sensitivity\\r\\n    }\\r\\n} else {\\r\\n    value = '00000000'\\r\\n    dataSMS = `FL0,1,1`;\\r\\n}\\r\\n// create HEADER\\r\\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\\r\\nvar command = '02'\\r\\nvar keyLength = '02'\\r\\nvar key = '56'\\r\\nvar messageBody = command + keyLength + key + value\\r\\nvar checksum = byteStringToByteArray(messageBody)\\r\\nchecksum = crc16byte(checksum)\\r\\nchecksum = decimalToHex(checksum)\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\\r\\nchecksum = changeEndianness(checksum)\\r\\n//Hpw to calculate sequenceID\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\\r\\nvar data = prefix + messageBody\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760467584}],"Tags":[]},{"Id":4960,"Name":"setGateway","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '30';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar sosKeyLength = '00';\r\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.SMSGateway) {\r\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\r\n    var gateway = gatewayString[1];\r\n    gateway_number = gatewayString[0];\r\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\r\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\r\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\n    messageBody += sosKeyLength + key + confSOS + numberHex;\r\n    dataSMS = `A10,1,0,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000';  //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":2,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4960,\"Name\":\"setGateway\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.SMSGateway) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\\r\\n    var gateway = gatewayString[1];\\r\\n    gateway_number = gatewayString[0];\\r\\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\\r\\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A10,1,0,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":2,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733955599},{"Type":1,"NewValue":"{\"Id\":4960,\"Name\":\"setGateway\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar gateway_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.SMSGateway) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\\r\\n    var gateway = gatewayString[1];\\r\\n    gateway_number = gatewayString[0];\\r\\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\\r\\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A10,1,0,${gateway_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":2,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734622575},{"Type":1,"NewValue":"{\"Id\":4960,\"Name\":\"setGateway\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar gateway_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.SMSGateway) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\\r\\n    var gateway = gatewayString[1];\\r\\n    gateway_number = gatewayString[0];\\r\\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\\r\\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A10,0,0,${gateway_number}`; //  doesn't accept SMS+ Untogle Call\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":2,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734632777},{"Type":1,"NewValue":"{\"Id\":4960,\"Name\":\"setGateway\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar gateway_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.SMSGateway) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\\r\\n    var gateway = gatewayString[1];\\r\\n    gateway_number = gatewayString[0];\\r\\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\\r\\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A10,0,0,${gateway_number}`; //  doesn't accept SMS+ Untogle Call\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":2,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760600454}],"Tags":[]},{"Id":4959,"Name":"setServer","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local APN':\r\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\r\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\r\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) APN and Server and Gateway Number\r\nvar messageBody = '02';\r\n// Server\r\nvar domain = '';\r\nvar port = '';\r\nvar serverLength = '00';\r\n// APN\r\nvar apn = '';\r\nvar apn_password = '';\r\nvar apn_username = '';\r\nvar apnLength = '00';\r\nvar apnUserLength = '00';\r\nvar apnPassLength = '00';\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.Server) {\r\n    var serverString = params.CommunicationSettings.Server.split(',');\r\n    domain = serverString[0];\r\n    port = serverString[1];\r\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\r\n    // Server IP and Port\r\n    domain = ascii_to_hexa(domain).toUpperCase();\r\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\r\n    // key 43 and TCP and GPRS is 80\r\n    messageBody += serverLength + \"4380\" + port + domain;\r\n    // For SMS\r\n    dataSMS = `IP1,${serverString[0]},${serverString[1]}`;\r\n}\r\nif (params.CommunicationSettings.APN) {\r\n    var apnString = params.CommunicationSettings.APN.split(',');\r\n    // APN\r\n    apn = apnString[0];\r\n    apn = ascii_to_hexa(apn).toUpperCase();\r\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnLength + \"40\" + apn;\r\n    // APN username\r\n    apn_username = apnString[1];\r\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\r\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnUserLength + \"41\" + apn_username;\r\n    // APN passwprd\r\n    apn_password = apnString[2];\r\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\r\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnPassLength + \"42\" + apn_password;\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4959,\"Name\":\"setServer\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//para pruebas en local APN':\\r\\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\\r\\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\\r\\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02) APN and Server and Gateway Number\\r\\nvar messageBody = '02';\\r\\n// Server\\r\\nvar domain = '';\\r\\nvar port = '';\\r\\nvar serverLength = '00';\\r\\n// APN\\r\\nvar apn = '';\\r\\nvar apn_password = '';\\r\\nvar apn_username = '';\\r\\nvar apnLength = '00';\\r\\nvar apnUserLength = '00';\\r\\nvar apnPassLength = '00';\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.Server) {\\r\\n    var serverString = params.CommunicationSettings.Server.split(',');\\r\\n    domain = serverString[0];\\r\\n    port = serverString[1];\\r\\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\\r\\n    // Server IP and Port\\r\\n    domain = ascii_to_hexa(domain).toUpperCase();\\r\\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\\r\\n    // key 43 and TCP and GPRS is 80\\r\\n    messageBody += serverLength + \\\"4380\\\" + port + domain;\\r\\n    // For SMS\\r\\n    dataSMS = `IP1,${serverString[0]},${serverString[1]}`;\\r\\n}\\r\\nif (params.CommunicationSettings.APN) {\\r\\n    var apnString = params.CommunicationSettings.APN.split(',');\\r\\n    // APN\\r\\n    apn = apnString[0];\\r\\n    apn = ascii_to_hexa(apn).toUpperCase();\\r\\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnLength + \\\"40\\\" + apn;\\r\\n    // APN username\\r\\n    apn_username = apnString[1];\\r\\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\\r\\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnUserLength + \\\"41\\\" + apn_username;\\r\\n    // APN passwprd\\r\\n    apn_password = apnString[2];\\r\\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\\r\\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnPassLength + \\\"42\\\" + apn_password;\\r\\n}\\r\\n// create HEADER\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":true,\"Order\":0,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761679057}],"Tags":[]},{"Id":4958,"Name":"getCurrentSettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar value = '214A1A3440414243567356101F4453473330';\r\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\n//var keyLength = '10'; // previous\r\nvar keyLength = '13';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar dataSMS = 'V?'; // Get Firmware\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":17,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4957,"Name":"getFirmwareVersion","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar value = '1A'; //Ask for firmware Long\r\nvar command = '02';\r\nvar keyLength = '02';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'V?';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":16,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4957,\"Name\":\"getFirmwareVersion\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar value = '1A'; //Ask for firmware Long\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'V?';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466128},{"Type":1,"NewValue":"{\"Id\":4957,\"Name\":\"getFirmwareVersionLong\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar value = '1A'; //Ask for firmware Long\\r\\nvar command = '02';\\r\\nvar keyLength = '02';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0400' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'V?';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1790530512}],"Tags":[]},{"Id":4956,"Name":"getCurrentSettings3","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'BCQ1'; // Check Beacon List\r\n/* 1,F7:37:B7:10:81:CE,office1\r\n2,C4:9F:A6:15:24:3F,office2\r\n3,D3:E3:AC:86:5E:46,office7 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":19,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4956,\"Name\":\"getCurrentSettings3\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'BCQ1'; // Check Beacon List\\r\\n/* 1,F7:37:B7:10:81:CE,office1\\r\\n2,C4:9F:A6:15:24:3F,office2\\r\\n3,D3:E3:AC:86:5E:46,office7 */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":{\"Id\":4958,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"0.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '214A1A3440414243567356101F4453473330';\\r\\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '13';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":19,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733390414}],"Tags":[]},{"Id":4955,"Name":"getCurrentSettings4","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'A?'; // Check Contact List\r\n/* A1: 1,1,15899795842\r\nA2: 1,0,13632770106\r\nA3: 0,1,15986236978 */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":20,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4955,\"Name\":\"getCurrentSettings4\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'A?'; // Check Contact List\\r\\n/* A1: 1,1,15899795842\\r\\nA2: 1,0,13632770106\\r\\nA3: 0,1,15986236978 */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":{\"Id\":4958,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"0.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '214A1A3440414243567356101F4453473330';\\r\\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '13';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":20,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733390446}],"Tags":[]},{"Id":4954,"Name":"getCurrentSettings5","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// Contacts, APN, server details, fall sensitivity and Beacon List\r\nvar dataSMS = 'GPRS?'; // Check Server Details\r\n/*GRPS: ON\r\nAPN: internet\r\nUsername:\r\nPassword:\r\nIP: 1, www.smart-locator.com\r\nPort: 6060\r\nMove report time: 30 minutes\r\nNo move report time: 60 minutes\r\nHB: on, 20 minutes */\r\nvar data = ''; // empty\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar notSend = false;\r\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\r\n    notSend = true;\r\n}\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":true,"SendingType":0,"HasAck":true,"HexString":true,"Order":21,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4954,\"Name\":\"getCurrentSettings5\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar dataSMS = 'GPRS?'; // Check Server Details\\r\\n/*GRPS: ON\\r\\nAPN: internet\\r\\nUsername:\\r\\nPassword:\\r\\nIP: 1, www.smart-locator.com\\r\\nPort: 6060\\r\\nMove report time: 30 minutes\\r\\nNo move report time: 60 minutes\\r\\nHB: on, 20 minutes */\\r\\nvar data = ''; // empty\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar notSend = false;\\r\\nif (isForcedBySMS == 'False' && ((serverParams.CommandType == 'ByGPRS') || (serverParams.CommandType == 'Default' && ((serverParams.ParentCommandType == 'ByGPRS') || (serverParams.ParentCommandType == 'Default' && serverParams.ConfigType == 'GPRS') || (serverParams.ParentCommandType === null && serverParams.ConfigType == 'GPRS'))))) {\\r\\n    notSend = true;\\r\\n}\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":{\"Id\":4958,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"0.2\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"getCurrentSettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n//var value = '0234404142435673'; //Firmware, Contacts, APN, server details, fall sensitivity and Beacon List\\r\\nvar value = '214A1A3440414243567356101F4453473330';\\r\\n//SpeedDial, Wifi Network, Firmware Long, Contacts, APNusername, APNpass, server details, fall sensitivity and Beacon List, Fall down alert, Ring tome vol,System language, time interval, No motion alert,custom id, allow list, Emergency numbers\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\n//var keyLength = '10'; // previous\\r\\nvar keyLength = '13';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar dataSMS = 'V?'; // Get Firmware\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '1500' + checksum + sequenceID; // add 2 to keylenght\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":17},\"AvoidResending\":false,\"FollowParentSentType\":true,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":21,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1733390475}],"Tags":[]},{"Id":4953,"Name":"setMotionAlert","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.MovementAlert.EnableDisableMotionAlert == 'true') {\n    value += '1';\n    if (params.MovementAlert.Dial == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    if (params.MovementAlert.Time) {\n        var time = ('00000000000000' + decimalToBinary(parseInt(params.MovementAlert.Time))).slice(-14);\n        value += time;\n    }\n    if (params.MovementAlert.Cooldown) {\n        var time = ('0000000000000000' + decimalToBinary(parseInt(params.MovementAlert.Cooldown))).slice(-16);\n        value += time;\n        //console.log(value);\n    }\n} else {\n    value = '0';\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\nvalue = changeEndianness(value);\n//value = value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '52';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = changeEndianness(checksum);\n//checksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x !== 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin;\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa;\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4952,"Name":"setSpeedDialSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.SpeedDial.EnableDisableSpeedDial == 'true') {\n    value += '10'; //Enable\n    value += '0'; //Long Press\n    /*if (params.SpeedDialButtonSettings.TriggerMode == '0') {\n        value += '0';\n    } else {\n        value += '1';\n    }*/\n    value += '0010'; //Auth2 number\n    var time = 20;\n    value += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\n    value += '11'; //feedback vibrate and voice\n    /*if (params.SpeedDialButtonSettings.Feedback) {\n        value += params.SpeedDialButtonSettings.Feedback;\n    } else {\n        value += '00';\n    }*/\n} else {\n    value = '0000000000000000';\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase();\nvalue = value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '03';\nvar key = '21';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":4951,"Name":"setSystemLanguage","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\n//create the bit table to use with control\r\nvar value = '';\r\nif (params.SystemSettings.SystemLanguage) {\r\n    var language = params.SystemSettings.SystemLanguage;\r\n    var languageHex = ascii_to_hexa(language).toUpperCase();\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = ('0' + decimalToHex(1 + (languageHex.length / 2))).slice(-2).toUpperCase();\r\nvar key = '1F'; //system language\r\nvar messageBody = command + keyLength + key + languageHex;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar totalLength = '0500';\r\nif (languageHex.length == 10) {\r\n    totalLength = '0800';\r\n}\r\nif (languageHex.length == 12) {\r\n    totalLength = '0900';\r\n}\r\n//Hpw to calculate sequenceID\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4950,"Name":"setNoMotionAlert","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.NonMovementSettings.EnableDisableNonMovementSettings == 'true') {\n    value += '1';\n    //if (params.NonMovementAlert.Dial == 'true') {\n    //    value += '1'\n    //} else {\n    value += '1'; // Dial by default\n    //}\n    if (params.NonMovementSettings.Time) {\n        var time = ('000000000000000000000000000000' + decimalToBinary(params.NonMovementSettings.Time)).slice(-30);\n        //var time = ('000000000000000000000000000000' + decimalToBinary(121)).slice(-30)\n        value += time;\n    }\n} else {\n    value = '0';\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase()\nvalue = value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2)\n//value = '2C010080'\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '05'\nvar key = '53'\nvar messageBody = command + keyLength + key + value\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4949,"Name":"setOverSpeedAlert","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = ''\nif (params.OverSpeedAlert.EnableDisableOverSpeedAlert == 'true') {\n    value += '1'\n    if (params.OverSpeedAlert.Speed) {\n        var angle = ('000000000000000' + decimalToBinary(parseInt(params.OverSpeedAlert.Speed))).slice(-15)\n        value += angle\n    }\n} else {\n    value = '0'\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase()\nvalue = changeEndianness(value)\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '03'\nvar key = '54'\nvar messageBody = command + keyLength + key + value\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = changeEndianness(checksum.toString())\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4948,"Name":"setHomeBeacon","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n// BeaconName\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar dataSMS = '';\r\n//create the bit table to use with control\r\nvar value = '';\r\nvar beacon_name = '';\r\nvar beacon_mac = '000000000000'; //default\r\n// always enable\r\nvalue += '1'; //Enable\r\nvalue += '0000000'; // Beacon 1\r\n/*if (params.SetBeacon1.EnableDisableBeacon1 == 'true') {\r\n    value += '1'; //Enable\r\n    value += '0000000'; // Beacon 1\r\n    //Beacon  1\r\n} else {\r\n    value = '00000000';\r\n}*/\r\n// name, mac, major, minor\r\nif (params.HomeBeacon.BeaconName) {\r\n    beaconString = params.HomeBeacon.BeaconName.split(',');\r\n    var beacon_name = ascii_to_hexa(beaconString[0].replace(/\\s+/g, ''));\r\n    var beacon_mac = beaconString[1].replace(/:/g, '');\r\n    beacon_mac = changeEndianness(beacon_mac);\r\n    var beacon_major = beaconString[2];\r\n    var beacon_minor = beaconString[3];\r\n    dataSMS = `BSC0.0,0.0,${beaconString[1]},${beaconString[0].replace(/\\s+/g, '')}`;\r\n}\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = ('00' + decimalToHex(16 + (beacon_name.length / 2))).slice(-2).toUpperCase();\r\nvar key = '73';\r\nvar suffix = '0000000000000000'; // lat and long. not needed\r\nvar messageBody = command + keyLength + key + value + beacon_mac + suffix + beacon_name;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar totalLenght = ('0000' + decimalToHex(18 + (beacon_name.length / 2))).slice(-4).toUpperCase();\r\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":7,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4948,\"Name\":\"setHomeBeacon\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n// BeaconName\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar dataSMS = '';\\r\\n//create the bit table to use with control\\r\\nvar value = '';\\r\\nvar beacon_name = '';\\r\\nvar beacon_mac = '000000000000'; //default\\r\\n// always enable\\r\\nvalue += '1'; //Enable\\r\\nvalue += '0000000'; // Beacon 1\\r\\n/*if (params.SetBeacon1.EnableDisableBeacon1 == 'true') {\\r\\n    value += '1'; //Enable\\r\\n    value += '0000000'; // Beacon 1\\r\\n    //Beacon  1\\r\\n} else {\\r\\n    value = '00000000';\\r\\n}*/\\r\\n// name, mac, major, minor\\r\\nif (params.HomeBeacon.BeaconName) {\\r\\n    beaconString = params.HomeBeacon.BeaconName.split(',');\\r\\n    var beacon_name = ascii_to_hexa(beaconString[0].replace(/\\\\s+/g, ''));\\r\\n    var beacon_mac = beaconString[1].replace(/:/g, '');\\r\\n    beacon_mac = changeEndianness(beacon_mac);\\r\\n    var beacon_major = beaconString[2];\\r\\n    var beacon_minor = beaconString[3];\\r\\n    dataSMS = `BSC0.0,0.0,${beaconString[1]},${beaconString[0].replace(/\\\\s+/g, '')}`;\\r\\n}\\r\\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = ('00' + decimalToHex(16 + (beacon_name.length / 2))).slice(-2).toUpperCase();\\r\\nvar key = '73';\\r\\nvar suffix = '0000000000000000'; // lat and long. not needed\\r\\nvar messageBody = command + keyLength + key + value + beacon_mac + suffix + beacon_name;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar totalLenght = ('0000' + decimalToHex(18 + (beacon_name.length / 2))).slice(-4).toUpperCase();\\r\\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes;\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x !== 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin;\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760467638}],"Tags":[]},{"Id":4947,"Name":"setSMSGatewayNumber","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar gateway_number = '00000000000';\r\nvar nameHex = ascii_to_hexa('No Esendex').toUpperCase();\r\nvar value = '';\r\nif (params.CommunicationSettings.SMSGateway) {\r\n    value += '110'; // Enable + accept SMS+ Untogle Call\r\n    //Authorised number 10\r\n    value += '01001'; // No SIM Dialing + Contact Number 10\r\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\r\n    var gateway = gatewayString[1];\r\n    gateway_number = gatewayString[0];\r\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\r\n    numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\r\n    nameHex = ascii_to_hexa(gateway).toUpperCase();\r\n} else {\r\n    value += '000'; // Disable + not accept SMS +Untogle Call\r\n    value += '01001';\r\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\r\n    numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\r\n}\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar key = '34';\r\nvar keyLength = ('00' + decimalToHex(5 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-2).toUpperCase();\r\nvar nameLenght = ('00' + decimalToHex((nameHex.length / 2))).slice(-2).toUpperCase();\r\nvar messageBody = command + keyLength + key + value + numberLength + numberHex + nameLenght + nameHex + '00'; // no photo\r\nvar totalLenght = ('0000' + decimalToHex(7 + (numberHex.length / 2) + (nameHex.length / 2))).slice(-4).toUpperCase();\r\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":3,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4946,"Name":"setCustom ID","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar key = '47';\nif (params.CustomID.CustomID == 'true') {\n    var keyLength = '02';\n    var customID = '06';\n    var totalLenght = '0400';\n} else {\n    var keyLength = '01';\n    var customID = '';\n    var totalLenght = '0300';\n}\nvar messageBody = command + keyLength + key + customID;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\nvar data = prefix + messageBody;\n// For GPRS command\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":5,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4946,\"Name\":\"setCustom ID\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar key = '47';\\n//if (params.CustomID.CustomID == 'true') {\\nvar keyLength = '02';\\nvar customID = '04'; // Roam\\nvar totalLenght = '0400';\\n//} else {\\n//    var keyLength = '01';\\n//    var customID = '';\\n//    var totalLenght = '0300';\\n//}\\nvar messageBody = command + keyLength + key + customID;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":3,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466515}],"Tags":[]},{"Id":4945,"Name":"setHeartRateDetectingInterval","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nif (params.HeartRateMonitor.HeartRateDetectingInterval) {\n    var heartBeat = parseInt(params.HeartRateMonitor.HeartRateDetectingInterval) * 60;\n    heartBeat = decimalToHex(heartBeat);\n    heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n    if (params.HeartRateMonitor.EnableDisableHeartRateMonitor == 'true') {\n        heartBeat = '80' + heartBeat;\n    } //enable\n    else {\n        heartBeat = '00' + heartBeat;\n    } //disable\n    heartBeat = heartBeat.substring(6, 8) + heartBeat.substring(4, 6) + heartBeat.substring(2, 4) + heartBeat.substring(0, 2);\n} else {\n    var heartBeat = '58 02 00 00'\n} // disable and 600 seconds\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '46';\nvar totalLenght = '0700';\nvar messageBody = command + keyLength + key + heartBeat;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":4944,"Name":"setVoicePrompt","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\n//create the bit table to use with control\r\nvar value = '';\r\nif (params.VoicePrompt.Beep == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.TiltCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Charging == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Battery == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call1 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call2 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call3 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call4 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call5 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Fall == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.SOS == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Click == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.NoMotion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Motion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Tilt == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Activity == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Find == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call6 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Time == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined  bit 20\r\nif (params.VoicePrompt.CallError == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallDisconnected == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallHang == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call7 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call8 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call9 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call10 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmComplete == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BLE == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BaseLocation == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined bit 31\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n    var newString = \"\";\r\n    for (var i = str.length - 1; i >= 0; i--) {\r\n        newString += str[i];\r\n    }\r\n    return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '19';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4943,"Name":"setCycle","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.CycleInterval.HeartbeatInterval) {\n    var heartBeat = parseInt(params.CycleInterval.HeartbeatInterval) * 60;\n    heartBeat = decimalToHex(heartBeat);\n    heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n    heartBeat = '80' + heartBeat;\n    heartBeat = heartBeat.substring(6, 8) + heartBeat.substring(4, 6) + heartBeat.substring(2, 4) + heartBeat.substring(0, 2);\n}\nif (params.CycleInterval.CycleInterval) {\n    var cycleInterval = parseInt(params.CycleInterval.CycleInterval) * 60;\n    cycleInterval = decimalToHex(cycleInterval);\n    cycleInterval = ('00000000' + cycleInterval).slice(-8).toUpperCase();\n    cycleInterval = cycleInterval.substring(6, 8) + cycleInterval.substring(4, 6) + cycleInterval.substring(2, 4) + cycleInterval.substring(0, 2);\n}\nif (params.CycleInterval.LazyCycleInterval) {\n    var lazyCycleInterval = parseInt(params.CycleInterval.LazyCycleInterval) * 60;\n    lazyCycleInterval = decimalToHex(lazyCycleInterval);\n    lazyCycleInterval = ('00000000' + lazyCycleInterval).slice(-8).toUpperCase();\n    lazyCycleInterval = lazyCycleInterval.substring(6, 8) + lazyCycleInterval.substring(4, 6) + lazyCycleInterval.substring(2, 4) + lazyCycleInterval.substring(0, 2);\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '0D';\nvar key = '44';\nvar messageBody = command + keyLength + key + heartBeat + cycleInterval + lazyCycleInterval;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4942,"Name":"setAlarmClock2","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.AlarmClock2.EnableDisableAlarmClock2 == 'true') {\n    var index = '81'\n    if (params.AlarmClock2.Time) {\n        var hour = params.AlarmClock2.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(0, 2)\n        hour = parseInt(hour)\n        hour = decimalToHex(hour)\n        hour = ('00' + hour).slice(-2).toUpperCase()\n        var min = params.AlarmClock2.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(2, 4)\n        min = parseInt(min)\n        min = decimalToHex(min)\n        min = ('00' + min).slice(-2).toUpperCase()\n    } else {\n        var hour = '0C'; // default time 12:00\n        var min = '00';\n    }\n    //create the bit table to use with workdays\n    var workday = 0\n    if (params.AlarmClock2.Monday == 'true') {\n        workday += 1\n    }\n    if (params.AlarmClock2.Tuesday == 'true') {\n        workday += 2\n    }\n    if (params.AlarmClock2.Wednesday == 'true') {\n        workday += 4\n    }\n    if (params.AlarmClock2.Thursday == 'true') {\n        workday += 8\n    }\n    if (params.AlarmClock2.Friday == 'true') {\n        workday += 16\n    }\n    if (params.AlarmClock2.Saturday == 'true') {\n        workday += 32\n    }\n    if (params.AlarmClock2.Sunday == 'true') {\n        workday += 64\n    }\n    workday = decimalToHex(workday).toUpperCase()\n    workday = ('00' + workday).slice(-2).toUpperCase()\n    if (params.AlarmClock2.Duration) {\n        var duration = params.AlarmClock2.Duration\n        duration = decimalToHex(parseInt(duration)).toUpperCase()\n        duration = ('00' + duration).slice(-2).toUpperCase()\n    } else {\n        var duration = '1E';\n    }\n    var ring = '01'\n    var value = index + hour + min + workday + duration + ring\n} else {\n    value = '010000000101'\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '07'\nvar key = '0B'\nvar messageBody = command + keyLength + key + value\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\nvar prefix = 'AB10' + '0900' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4941,"Name":"setVoicePromptVolume","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.SystemSettings.Volume) {\n    var volume = parseInt(params.SystemSettings.Volume)\n    volume = decimalToHex(volume)\n    volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '1C'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = changeEndianness(checksum)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4939,"Name":"setEnableControl","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.EnableControl.LED == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.Beep == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.Vibration == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.CellTowerLocating == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.WiFi == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.SOSCallSpeaker == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.SideCallSpeaker == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.BLEStayConnected == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.BLELocating == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.SOSCallVoice == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.BLEAlwaysON == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.GPSLocate == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.AlertTCPFast == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue += '0'; //watch only  girar muñeca para iluminar pantalla\nif (params.EnableControl.Beacon == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue += '0'; // activity fuction, \n//step counting, \nif (params.EnableControl.Step == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\n//home-wifi location, data-saver, NLprovider, power control,\n// sos cancel switch, Long SMS,  plus 7 more without functions\nvalue += '0000';\nif (params.EnableControl.StopCallSequence == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue += '00000000';\nif (params.EnableControl.AutoUpdate == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.AGPS == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue = reverseString(value);\n\nfunction reverseString(str) {\n    var newString = \"\";\n    for (var i = str.length - 1; i >= 0; i--) {\n        newString += str[i];\n    }\n    return newString;\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\nvalue = changeEndianness(value);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '0F';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = changeEndianness(checksum);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4939,\"Name\":\"setEnableControl\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\n// Default values for Roam\\n// [Length]:05 [Key]:0F [Value]:7F 5B 00 C0\\n//{\\\"enableControl\\\":{\\\"beep\\\":1,\\\"motor\\\":1,\\\"autoUpdate\\\":1,\\\"activity\\\":0,\\\"agps\\\":1,\\\"flagValue\\\":3221248895,\\\"led\\\":1,\\\"networkLoc\\\":0,\\\"sosCannel\\\":0,\\\"homeWifi\\\":0,\\\"tcpFast\\\":1,\\\"gpsLoc\\\":1,\\\"homeBeacon\\\":1,\\\"bleLongConnect\\\":0,\\\"sosCallNumberVoice\\\":1,\\\"powerControl\\\":0,\\\"xSpeaker\\\":1,\\\"wifiLoc\\\":1,\\\"dataSaver\\\":0,\\\"longSMS\\\":0,\\\"gsmLoc\\\":1,\\\"bleAdvAlways\\\":0,\\\"sosSpeaker\\\":1,\\\"step\\\":0,\\\"bleLoc\\\":1}}\\n//create the bit table to use with control\\nvar value = '7F5B00C0'; // added default value\\n/*\\nif (params.EnableControl.LED == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.Beep == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.Vibration == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.CellTowerLocating == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.WiFi == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.SOSCallSpeaker == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.SideCallSpeaker == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.BLEStayConnected == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.BLELocating == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.SOSCallVoice == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.BLEAlwaysON == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.GPSLocate == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.AlertTCPFast == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue += '0'; //watch only  girar muñeca para iluminar pantalla\\nif (params.EnableControl.Beacon == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue += '0'; // activity fuction, \\n//step counting, \\nif (params.EnableControl.Step == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\n//home-wifi location, data-saver, NLprovider, power control,\\n// sos cancel switch, Long SMS,  plus 7 more without functions\\nvalue += '0000';\\nif (params.EnableControl.StopCallSequence == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue += '00000000';\\nif (params.EnableControl.AutoUpdate == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.AGPS == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue = reverseString(value);\\n\\nfunction reverseString(str) {\\n    var newString = \\\"\\\";\\n    for (var i = str.length - 1; i >= 0; i--) {\\n        newString += str[i];\\n    }\\n    return newString;\\n}\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\nvalue = changeEndianness(value); */\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '0F';\\nvar messageBody = command + keyLength + key + value;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum);\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\nchecksum = changeEndianness(checksum);\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\\n\\nfunction decimalToBinary(x) {\\n    let bin = 0;\\n    let rem, i = 1,\\n        step = 1;\\n    while (x != 0) {\\n        rem = x % 2;\\n        x = parseInt(x / 2);\\n        bin = bin + rem * i;\\n        i = i * 10;\\n    }\\n    return bin\\n}\\n\\nfunction binaryToHex(x) {\\n    var hexa = parseInt(x, 2).toString(16);\\n    return hexa\\n}\\n\\nfunction changeEndianness(string) {\\n    const result = [];\\n    let len = string.length - 2;\\n    while (len >= 0) {\\n        result.push(string.substr(len, 2));\\n        len -= 2;\\n    }\\n    return result.join('');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":6,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760467518}],"Tags":[]},{"Id":4938,"Name":"setSOSButtonSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.SOSButtonSettings.EnableDisableSOSButtonSettings == 'true') {\n    value += '10';\n    if (params.SOSButtonSettings.TriggerMode == '0') {\n        value += '0';\n    } else {\n        value += '1';\n    }\n    /*\n    if (params.SOSButtonSettings.CallTo == '0'){\n        value += '0001'\n    }else { \n        value += '0000'\n    }\n    */\n    value += '1111'; //SOS task (Default)  Standard\n    var time = 20;\n    value += ('0000000' + decimalToBinary(parseInt(time))).slice(-7);\n    if (params.SOSButtonSettings.Feedback) {\n        value += params.SOSButtonSettings.Feedback;\n    } else {\n        value += '00';\n    }\n} else {\n    value = '0000000000000000';\n}\nvalue = ('0000' + binaryToHex(value)).slice(-4).toUpperCase();\nvalue = value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '03';\nvar key = '20';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x !== 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin;\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":4937,"Name":"setExtraEnableControl","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '';\r\n// Wifi loc name EV07, beacon leaves home alert, beacon V2, BLE scan switch,\r\n// XXX, no motion alert data only EV05, power saving EV06, Stop alert call sequence.\r\nvalue += '0000000';\r\nif (params.EnableControl.StopCallSequence == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n    var newString = \"\";\r\n    for (var i = str.length - 1; i >= 0; i--) {\r\n        newString += str[i];\r\n    }\r\n    return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '75';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4936,"Name":"setAlarmClock4","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.AlarmClock4.EnableDisableAlarmClock4 == 'true') {\n    var index = '83'\n    if (params.AlarmClock4.Time) {\n        var hour = params.AlarmClock4.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(0, 2)\n        hour = parseInt(hour)\n        hour = decimalToHex(hour)\n        hour = ('00' + hour).slice(-2).toUpperCase()\n        var min = params.AlarmClock4.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(2, 4)\n        min = parseInt(min)\n        min = decimalToHex(min)\n        min = ('00' + min).slice(-2).toUpperCase()\n    } else {\n        var hour = '0C'; // default time 12:00\n        var min = '00';\n    }\n    //create the bit table to use with workdays\n    var workday = 0\n    if (params.AlarmClock4.Monday == 'true') {\n        workday += 1\n    }\n    if (params.AlarmClock4.Tuesday == 'true') {\n        workday += 2\n    }\n    if (params.AlarmClock4.Wednesday == 'true') {\n        workday += 4\n    }\n    if (params.AlarmClock4.Thursday == 'true') {\n        workday += 8\n    }\n    if (params.AlarmClock4.Friday == 'true') {\n        workday += 16\n    }\n    if (params.AlarmClock4.Saturday == 'true') {\n        workday += 32\n    }\n    if (params.AlarmClock4.Sunday == 'true') {\n        workday += 64\n    }\n    workday = decimalToHex(workday).toUpperCase()\n    workday = ('00' + workday).slice(-2).toUpperCase()\n    if (params.AlarmClock4.Duration) {\n        var duration = params.AlarmClock4.Duration\n        duration = decimalToHex(parseInt(duration)).toUpperCase()\n        duration = ('00' + duration).slice(-2).toUpperCase()\n    } else {\n        var duration = '1E';\n    }\n    var ring = '01'\n    var value = index + hour + min + workday + duration + ring\n} else {\n    value = '030000000101'\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '07'\nvar key = '0B'\nvar messageBody = command + keyLength + key + value\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\nvar prefix = 'AB10' + '0900' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4935,"Name":"setOystaNumber","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = ''\nvalue += '1'\nvalue += '010'\n//Authorised number 10\nvalue += '1001'\nvar number = '+447781482635'\nvar numberHex = ascii_to_hexa(number).toUpperCase()\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase()\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase()\nvar key = '30'\nvar messageBody = command + keyLength + key + value + numberHex\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\nvar totalLenght = ('0000' + decimalToHex(4 + (numberHex.length / 2))).slice(-4).toUpperCase()\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4934,"Name":"setStepCollectSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nif (params.StepCounting.StepCountingInterval) {\n    var heartBeat = parseInt(params.StepCounting.StepCountingInterval) * 60;\n    heartBeat = decimalToHex(heartBeat);\n    heartBeat = ('000000' + heartBeat).slice(-6).toUpperCase();\n    if (params.StepCounting.EnableDisableStepCounting == 'true') {\n        heartBeat = '80' + heartBeat;\n    } //enable\n    else {\n        heartBeat = '00' + heartBeat;\n    } //disable\n    heartBeat = heartBeat.substring(6, 8) + heartBeat.substring(4, 6) + heartBeat.substring(2, 4) + heartBeat.substring(0, 2);\n} else {\n    var heartBeat = '58 02 00 00';\n} // disable and 600 seconds\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '5B';\nvar totalLength = '0700';\nvar messageBody = command + keyLength + key + heartBeat;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":4933,"Name":"setSMSPassword","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar password = '00000000';\r\nif (params.SMSPassword.EnableDisableSMSPassword == 'true') {\r\n    if (params.SMSPassword.SMSPassword) {\r\n        password = parseInt(params.SMSPassword.SMSPassword);\r\n        password = decimalToHex(password);\r\n        password = ('000000' + password).slice(-6).toUpperCase();\r\n        password = changeEndianness(password) + '80';\r\n    }\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '0D';\r\nvar messageBody = command + keyLength + key + password;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum).toUpperCase();\r\nchecksum = ('0000' + checksum).slice(-4);\r\nchecksum = changeEndianness(checksum);\r\n//Hpw to calculate sequenceID\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4932,"Name":"setFallDownAlert","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = ''\r\nif (params.FallSettings.EnableDisableFallSettings == 'true') {\r\n    value += '1'\r\n    //if (params.FallAlarm.Dial == 'true') {\r\n    //    value += '100'\r\n    //} else {\r\n    value += '000'\r\n    //}\r\n    if (params.FallSettings.Sensitivity) {\r\n        var sensitivity = parseInt(params.FallSettings.Sensitivity)\r\n        sensitivity = ('0000' + decimalToBinary(sensitivity)).slice(-4).toUpperCase()\r\n        value += sensitivity\r\n    }\r\n} else {\r\n    value = '00000000'\r\n}\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\r\nvar command = '02'\r\nvar keyLength = '02'\r\nvar key = '56'\r\nvar messageBody = command + keyLength + key + value\r\nvar checksum = byteStringToByteArray(messageBody)\r\nchecksum = crc16byte(checksum)\r\nchecksum = decimalToHex(checksum)\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\r\nchecksum = changeEndianness(checksum)\r\n//Hpw to calculate sequenceID\r\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\r\nvar data = prefix + messageBody\r\n//var data = 'AB100400 7CEE0200020256C1';\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4931,"Name":"setSOSOption","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar talkTime = 65534\ntalkTime = decimalToHex(talkTime)\ntalkTime = ('0000' + talkTime).slice(-4).toUpperCase()\ntalkTime = changeEndianness(talkTime)\nif (params.SOSButtonSettings.RingTime) {\n    var ringTime = params.SOSButtonSettings.RingTime\n    ringTime = parseInt(ringTime)\n    ringTime = decimalToHex(ringTime)\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase()\n} else {\n    var ringTime = 20;\n    ringTime = decimalToHex(ringTime);\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase();\n}\nif (params.SOSButtonSettings.Retries) {\n    var tries = params.SOSButtonSettings.Retries\n    tries = parseInt(tries)\n    tries = decimalToHex(tries)\n    tries = ('00' + tries).slice(-2).toUpperCase()\n} else {\n    var tries = '01';\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '05'\nvar key = '32'\nvar messageBody = command + keyLength + key + talkTime + ringTime + tries\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = changeEndianness(checksum)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4931,\"Name\":\"setSOSOption\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar talkTime = 65534\\ntalkTime = decimalToHex(talkTime)\\ntalkTime = ('0000' + talkTime).slice(-4).toUpperCase()\\ntalkTime = changeEndianness(talkTime)\\n/*if (params.SOSButtonSettings.RingTime) {\\n    var ringTime = params.SOSButtonSettings.RingTime\\n    ringTime = parseInt(ringTime)\\n    ringTime = decimalToHex(ringTime)\\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase()\\n} else {*/\\nvar ringTime = 25;\\nringTime = decimalToHex(ringTime);\\nringTime = ('00' + ringTime).slice(-2).toUpperCase();\\n/*}\\nif (params.SOSButtonSettings.Retries) {\\n    var tries = params.SOSButtonSettings.Retries\\n    tries = parseInt(tries)\\n    tries = decimalToHex(tries)\\n    tries = ('00' + tries).slice(-2).toUpperCase()\\n} else {*/\\nvar tries = '01';\\n//}\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\\nvar command = '02'\\nvar keyLength = '05'\\nvar key = '32'\\nvar messageBody = command + keyLength + key + talkTime + ringTime + tries\\nvar checksum = byteStringToByteArray(messageBody)\\nchecksum = crc16byte(checksum)\\nchecksum = decimalToHex(checksum).toUpperCase()\\nchecksum = ('0000' + checksum).slice(-4)\\nchecksum = changeEndianness(checksum)\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID\\nvar data = prefix + messageBody\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\\n\\nfunction changeEndianness(string) {\\n    const result = [];\\n    let len = string.length - 2;\\n    while (len >= 0) {\\n        result.push(string.substr(len, 2));\\n        len -= 2;\\n    }\\n    return result.join('');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":8,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760468014}],"Tags":[]},{"Id":4930,"Name":"setAlarmClock3","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.AlarmClock3.EnableDisableAlarmClock3 == 'true') {\n    var index = '82'\n    if (params.AlarmClock3.Time) {\n        var hour = params.AlarmClock3.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(0, 2)\n        hour = parseInt(hour)\n        hour = decimalToHex(hour)\n        hour = ('00' + hour).slice(-2).toUpperCase()\n        var min = params.AlarmClock3.Time.replace(/[^a-zA-Z0-9]/g, \"\").substring(2, 4)\n        min = parseInt(min)\n        min = decimalToHex(min)\n        min = ('00' + min).slice(-2).toUpperCase()\n    } else {\n        var hour = '0C'; // default time 12:00\n        var min = '00';\n    }\n    //create the bit table to use with workdays\n    var workday = 0\n    if (params.AlarmClock3.Monday == 'true') {\n        workday += 1\n    }\n    if (params.AlarmClock3.Tuesday == 'true') {\n        workday += 2\n    }\n    if (params.AlarmClock3.Wednesday == 'true') {\n        workday += 4\n    }\n    if (params.AlarmClock3.Thursday == 'true') {\n        workday += 8\n    }\n    if (params.AlarmClock3.Friday == 'true') {\n        workday += 16\n    }\n    if (params.AlarmClock3.Saturday == 'true') {\n        workday += 32\n    }\n    if (params.AlarmClock3.Sunday == 'true') {\n        workday += 64\n    }\n    workday = decimalToHex(workday).toUpperCase()\n    workday = ('00' + workday).slice(-2).toUpperCase()\n    if (params.AlarmClock3.Duration) {\n        var duration = params.AlarmClock3.Duration\n        duration = decimalToHex(parseInt(duration)).toUpperCase()\n        duration = ('00' + duration).slice(-2).toUpperCase()\n    } else {\n        var duration = '1E';\n    }\n    var ring = '01'\n    var value = index + hour + min + workday + duration + ring\n} else {\n    value = '020000000101'\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '07'\nvar key = '0B'\nvar messageBody = command + keyLength + key + value\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum)\nchecksum = ('0000' + checksum).slice(-4).toUpperCase()\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\nvar prefix = 'AB10' + '0900' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4929,"Name":"setSpeedDialNumber","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar numberHex = '';\r\nvar value = '';\r\n// For Roam\r\nif (params.SpeedDial.EnableDisableSpeedDial == 'true') {\r\n    value += '10'; // Enable + Not accept SMS\r\n} else {\r\n    value += '00'; // Disable + not accept SMS\r\n}\r\nvalue += '0'; // Untogle Call\r\nif (params.SpeedDial.SpeedDialNumber) {\r\n    value += '00001'; // No SIM Dialing + Contact Number 2\r\n    // es posible que tengamos que definir un valor por defecto para el numero\r\n    var number = params.SpeedDial.SpeedDialNumber;\r\n    numberHex = ascii_to_hexa(number).toUpperCase();\r\n} else {\r\n    value += '00001';\r\n}\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\nvar key = '30';\r\nvar messageBody = command + keyLength + key + value + numberHex;\r\nvar totalLenght = ('0000' + decimalToHex(4 + (numberHex.length / 2))).slice(-4).toUpperCase();\r\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction fillHex(x, y) {\r\n    if (x % 2 == 0) {\r\n        return y\r\n    } else {\r\n        return y + '00'\r\n    }\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":4928,"Name":"setPowerAlert","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.PowerAlert.EnableDisablePowerAlert == 'true') {\n    if (params.PowerAlert.PowerOff == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    if (params.PowerAlert.PowerOn == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    if (params.PowerAlert.PowerLow == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    value += '0';\n    value += '000000000000';\n    value += '00000000';\n    if (params.PowerAlert.LowPowerThreshold) {\n        var threshold = ('00000000' + decimalToBinary(params.PowerAlert.LowPowerThreshold)).slice(-8);\n        value += threshold;\n    } else {\n        value += '00001111';\n    }\n} else {\n    value = '00000000000000000000000000000000';\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\nvalue = value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '50';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x !== 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin;\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4928,\"Name\":\"setPowerAlert\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\n// [Length]:05 [Key]:50 [Value]:14 00 00 E0\\n//{\\\"powerLowAlert\\\":{\\\"powerONSMS\\\":0,\\\"voice\\\":0,\\\"powerOFFSMS\\\":0,\\\"powerON\\\":1,\\\"voiceStatus\\\":0,\\\"powerOFF\\\":1,\\\"powerOFFLoc\\\":0,\\\"power\\\":20,\\\"status\\\":1}}\\nvar value = '140000E0';\\n/*\\nif (params.PowerAlert.EnableDisablePowerAlert == 'true') {\\n    if (params.PowerAlert.PowerOff == 'true') {\\n        value += '1';\\n    } else {\\n        value += '0';\\n    }\\n    if (params.PowerAlert.PowerOn == 'true') {\\n        value += '1';\\n    } else {\\n        value += '0';\\n    }\\n    if (params.PowerAlert.PowerLow == 'true') {\\n        value += '1';\\n    } else {\\n        value += '0';\\n    }\\n    value += '0';\\n    value += '000000000000';\\n    value += '00000000';\\n    if (params.PowerAlert.LowPowerThreshold) {\\n        var threshold = ('00000000' + decimalToBinary(params.PowerAlert.LowPowerThreshold)).slice(-8);\\n        value += threshold;\\n    } else {\\n        value += '00001111';\\n    }\\n} else {\\n    value = '00000000000000000000000000000000';\\n}\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\nvalue = value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2); */\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '50';\\nvar messageBody = command + keyLength + key + value;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum);\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = [];\\n    var j = 0;\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2);\\n        j++;\\n    }\\n    var bytes = [];\\n    var bytePos = 0;\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i];\\n        var b = parseInt(byteStr, 16);\\n        if (b < 256) {\\n            bytes[bytePos] = b;\\n            bytePos++;\\n        }\\n    }\\n    return bytes;\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString;\\n}\\n\\nfunction decimalToBinary(x) {\\n    let bin = 0;\\n    let rem, i = 1,\\n        step = 1;\\n    while (x !== 0) {\\n        rem = x % 2;\\n        x = parseInt(x / 2);\\n        bin = bin + rem * i;\\n        i = i * 10;\\n    }\\n    return bin;\\n}\\n\\nfunction binaryToHex(x) {\\n    var hexa = parseInt(x, 2).toString(16);\\n    return hexa;\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":11,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761679102}],"Tags":[]},{"Id":4927,"Name":"setSOSNumber","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar numberHex = '';\r\nvar numberLength = '00';\r\nvar phone_number = '00000000000';\r\nvar nameHex = ascii_to_hexa('SOS').toUpperCase();\r\nvar urlHex = ascii_to_hexa('https://test.myoysta.com/pearl_button_Non_Vector.jpeg').toUpperCase();\r\nvar urlLength = '35';\r\nvar value = '';\r\n// For Rio\r\nif (params.SOSButtonSettings.EnableDisableSOSButtonSettings == 'true') {\r\n    value += '10'; // Enable + Not accept SMS\r\n} else {\r\n    value += '00';\r\n} // Disable + not accept SMS\r\nif (params.SOSButtonSettings.Call == 'true') {\r\n    value += '1'; // Togle Call\r\n} else {\r\n    value += '0';\r\n} // Untogle Call\r\nif (params.SOSButtonSettings.Number) {\r\n    value += '00000'; // No SIM Dialing + Contact Number 1\r\n    phone_number = params.SOSButtonSettings.Number;\r\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n    numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\r\n} else {\r\n    value += '00000';\r\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n    numberLength = ('00' + decimalToHex(phone_number.length)).slice(-2).toUpperCase();\r\n}\r\n// photo URL\r\nvalue = ('00' + binaryToHex(value)).slice(-2).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar key = '34';\r\nvar keyLength = ('00' + decimalToHex(8 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\nvar nameLenght = ('00' + decimalToHex((nameHex.length / 2))).slice(-2).toUpperCase();\r\nvar messageBody = command + keyLength + key + value + numberLength + numberHex + nameLenght + nameHex + urlLength + urlHex; // no photo\r\nvar totalLenght = ('0000' + decimalToHex(7 + (urlHex.length / 2) + (numberHex.length / 2) + (nameHex.length / 2))).slice(-4).toUpperCase();\r\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID); //add 20/07\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa;\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":6,"ProtocolActionObjects":[],"Tags":[]},{"Id":4926,"Name":"actionInitializeMileage","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar value = '00000000';\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '09';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar totalLenght = '0007';\ntotalLenght = totalLenght.substring(2, 4) + totalLenght.substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\nvar data = prefix + messageBody;\n//var data = 'AB1007009E8B' + sequenceID + '02050900000000'\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}\n/*var configs = [];\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar data = 'AB1007009E8B' + sequenceID + '02050900000000'\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}*/","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4925,"Name":"setContinuousLocate","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.ContinuousLocate.Interval) {\n    var Interval = parseInt(params.ContinuousLocate.Interval) * 60;\n    Interval = decimalToHex(Interval);\n    Interval = ('0000' + Interval).slice(-4).toUpperCase();\n    Interval = Interval.substring(2, 4) + Interval.substring(0, 2);\n}\nif (params.ContinuousLocate.Duration) {\n    var Duration = parseInt(params.ContinuousLocate.Duration) * 60;\n    Duration = decimalToHex(Duration);\n    Duration = ('0000' + Duration).slice(-4).toUpperCase();\n    Duration = Duration.substring(2, 4) + Duration.substring(0, 2);\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '45';\nvar messageBody = command + keyLength + key + Interval + Duration;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4925,\"Name\":\"setContinuousLocate\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nif (params.ContinuousLocate.Interval) {\\n    var Interval = parseInt(params.ContinuousLocate.Interval) * 60;\\n    Interval = decimalToHex(Interval);\\n    Interval = ('0000' + Interval).slice(-4).toUpperCase();\\n    Interval = Interval.substring(2, 4) + Interval.substring(0, 2);\\n}\\nif (params.ContinuousLocate.Duration) {\\n    var Duration = parseInt(params.ContinuousLocate.Duration) * 60;\\n    Duration = decimalToHex(Duration);\\n    Duration = ('0000' + Duration).slice(-4).toUpperCase();\\n    Duration = Duration.substring(2, 4) + Duration.substring(0, 2);\\n}\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '45';\\nvar messageBody = command + keyLength + key + Interval + Duration;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = [];\\n    var j = 0;\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2);\\n        j++;\\n    }\\n    var bytes = [];\\n    var bytePos = 0;\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i];\\n        var b = parseInt(byteStr, 16);\\n        if (b < 256) {\\n            bytes[bytePos] = b;\\n            bytePos++;\\n        }\\n    }\\n    return bytes;\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString;\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":4,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466367},{"Type":1,"NewValue":"{\"Id\":4925,\"Name\":\"setContinuousLocate\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\n//if (params.ContinuousLocate.Interval) {\\n//var Interval = parseInt(params.ContinuousLocate.Interval) * 60;\\nvar Interval = 60; // default 60s\\nInterval = decimalToHex(Interval);\\nInterval = ('0000' + Interval).slice(-4).toUpperCase();\\nInterval = Interval.substring(2, 4) + Interval.substring(0, 2);\\n//}\\n//if (params.ContinuousLocate.Duration) {\\n//var Duration = parseInt(params.ContinuousLocate.Duration) * 60;\\nvar Duration = 600; // default 600 s\\nDuration = decimalToHex(Duration);\\nDuration = ('0000' + Duration).slice(-4).toUpperCase();\\nDuration = Duration.substring(2, 4) + Duration.substring(0, 2);\\n//}\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '45';\\nvar messageBody = command + keyLength + key + Interval + Duration;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = [];\\n    var j = 0;\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2);\\n        j++;\\n    }\\n    var bytes = [];\\n    var bytePos = 0;\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i];\\n        var b = parseInt(byteStr, 16);\\n        if (b < 256) {\\n            bytes[bytePos] = b;\\n            bytePos++;\\n        }\\n    }\\n    return bytes;\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString;\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":4,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466803}],"Tags":[]},{"Id":4924,"Name":"setAuthorisedNumbers","TemplateSMS":"","Template":"<<data>>","AckTemplate":null,"Operation":"//updated v 2\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local Contact':\r\n//AB104F008CF27D3D020E34A0013108436F6E7461637431000E34A1013208436F6E746163743200053402000000053403000000053404000000053405000000053406000000053407000000053408000000053409000000\r\n//var params = {'ApprovedContacts': {'Contact': [{'Number':'1','Name':'Contact1'},{'Number':'2','Name':'Contact2'} ]}};\r\nvar configs = [];\r\nvar idsToUpdate = []\r\nvar deletedId = []\r\nvar notSend = false;\r\nvar numberLength = '00';\r\nvar numberHex = '';\r\nvar nameLength = '00';\r\nvar blankName = '';\r\nvar value = '02';\r\nvar keyLength = '00';\r\nvar confTel = '';\r\nvar count = 2; // approved contact will be from A3 to A9 - index 2 to index 8\r\n//check if a number was deleted, and remove it from the list\r\nlet counter = 0;\r\nfor (var contactChanged of paramsChanged.ApprovedContacts) {\r\n    // update ids\r\n    var contacts = paramsChangedIds.ApprovedContacts[counter];\r\n    for (var item in contacts) {\r\n        idsToUpdate.push(contacts[item]);\r\n    }\r\n    if (contactChanged.Deleted === \"true\") {\r\n        //var cvpair1 = {code: p1,value: p2};\r\n        deletedId.push(contactChanged);\r\n    }\r\n    counter++;\r\n}\r\n//iterate over approved contacts, \r\nfor (var contact in params.ApprovedContacts) {\r\n    confTel = (binaryToHex(1000)).slice(-1).toUpperCase(); // Enable + Not accept SMS + No Accept Call + No SIM Dialing\r\n    if (deletedId.length > 0) {\r\n        if (checkValue(contact) === true) {\r\n            confTel = ('00' + decimalToHex(count)).slice(-2).toUpperCase(); // Add contact\r\n            value += \"0530\" + confTel + '000000'; //no number, no name, no photo\r\n        } else {\r\n            confTel = confTel + ('00' + decimalToHex(parseInt(count))).slice(-1).toUpperCase(); // Add contact from count to avoid rewrite SOS number and Dial number\r\n            numberHex = ascii_to_hexa(params.ApprovedContacts[contact].Contact).toUpperCase();\r\n            //numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\r\n            keyLength = ('00' + decimalToHex(2 + params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\r\n            //value += keyLength + \"30\" + confTel + numberLength + numberHex; //no photo\r\n            value += keyLength + \"30\" + confTel + numberHex; //no photo \r\n        }\r\n    } else {\r\n        confTel = confTel + ('00' + decimalToHex(parseInt(count))).slice(-1).toUpperCase(); // Add contact from count to avoid rewrite SOS number and Dial number\r\n        numberHex = ascii_to_hexa(params.ApprovedContacts[contact].Contact).toUpperCase();\r\n        //numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\r\n        keyLength = ('00' + decimalToHex(2 + params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\r\n        //value += keyLength + \"30\" + confTel + numberLength + numberHex; //no photo\r\n        value += keyLength + \"30\" + confTel + numberHex; //no photo\r\n    }\r\n    count++;\r\n}\r\n//and disable other contacts\r\nfor (var i = count; i < 9; i++) {\r\n    confTel = ('00' + decimalToHex(parseInt(i))).slice(-2).toUpperCase(); // Add contact\r\n    value += \"0530\" + confTel + '000000'; //no number, no name, no photo\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(value.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(value);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + value;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    idsToUpdate: idsToUpdate,\r\n    notSend: notSend\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction checkValue(contact) {\r\n    for (var d in deletedId) {\r\n        //if (d === contact) {\r\n        //    return true;\r\n        //}\r\n        if (params.ApprovedContacts[contact].Contact == paramsChanged.ApprovedContacts[d].Contact) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":8,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4924,\"Name\":\"setAuthorisedNumbers\",\"TemplateSMS\":\"\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"//updated v 2\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//para pruebas en local Contact':\\r\\n//AB104F008CF27D3D020E34A0013108436F6E7461637431000E34A1013208436F6E746163743200053402000000053403000000053404000000053405000000053406000000053407000000053408000000053409000000\\r\\n//var params = {'ApprovedContacts': {'Contact': [{'Number':'1','Name':'Contact1'},{'Number':'2','Name':'Contact2'} ]}};\\r\\nvar configs = [];\\r\\nvar idsToUpdate = []\\r\\nvar deletedId = []\\r\\nvar notSend = false;\\r\\nvar numberLength = '00';\\r\\nvar numberHex = '';\\r\\nvar nameLength = '00';\\r\\nvar blankName = '';\\r\\nvar value = '02';\\r\\nvar keyLength = '00';\\r\\nvar confTel = '';\\r\\nvar count = 2; // approved contact will be from A3 to A9 - index 2 to index 8\\r\\n//check if a number was deleted, and remove it from the list\\r\\nlet counter = 0;\\r\\nfor (var contactChanged of paramsChanged.ApprovedContacts) {\\r\\n    // update ids\\r\\n    var contacts = paramsChangedIds.ApprovedContacts[counter];\\r\\n    for (var item in contacts) {\\r\\n        idsToUpdate.push(contacts[item]);\\r\\n    }\\r\\n    if (contactChanged.Deleted === \\\"true\\\") {\\r\\n        //var cvpair1 = {code: p1,value: p2};\\r\\n        deletedId.push(contactChanged);\\r\\n    }\\r\\n    counter++;\\r\\n}\\r\\n//iterate over approved contacts, \\r\\nfor (var contact in params.ApprovedContacts) {\\r\\n    confTel = (binaryToHex(1000)).slice(-1).toUpperCase(); // Enable + Not accept SMS + No Accept Call + No SIM Dialing\\r\\n    if (deletedId.length > 0) {\\r\\n        if (checkValue(contact) === true) {\\r\\n            confTel = ('00' + decimalToHex(count)).slice(-2).toUpperCase(); // Add contact\\r\\n            value += \\\"0530\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n        } else {\\r\\n            confTel = confTel + ('00' + decimalToHex(parseInt(count))).slice(-1).toUpperCase(); // Add contact from count to avoid rewrite SOS number and Dial number\\r\\n            numberHex = ascii_to_hexa(params.ApprovedContacts[contact].Contact).toUpperCase();\\r\\n            //numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n            keyLength = ('00' + decimalToHex(2 + params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n            //value += keyLength + \\\"30\\\" + confTel + numberLength + numberHex; //no photo\\r\\n            value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo \\r\\n        }\\r\\n    } else {\\r\\n        confTel = confTel + ('00' + decimalToHex(parseInt(count))).slice(-1).toUpperCase(); // Add contact from count to avoid rewrite SOS number and Dial number\\r\\n        numberHex = ascii_to_hexa(params.ApprovedContacts[contact].Contact).toUpperCase();\\r\\n        //numberLength = ('00' + decimalToHex(params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n        keyLength = ('00' + decimalToHex(2 + params.ApprovedContacts[contact].Contact.length)).slice(-2).toUpperCase();\\r\\n        //value += keyLength + \\\"30\\\" + confTel + numberLength + numberHex; //no photo\\r\\n        value += keyLength + \\\"30\\\" + confTel + numberHex; //no photo\\r\\n    }\\r\\n    count++;\\r\\n}\\r\\n//and disable other contacts\\r\\nfor (var i = count; i < 9; i++) {\\r\\n    confTel = ('00' + decimalToHex(parseInt(i))).slice(-2).toUpperCase(); // Add contact\\r\\n    value += \\\"0530\\\" + confTel + '000000'; //no number, no name, no photo\\r\\n}\\r\\n// create HEADER\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLenght = ('0000' + decimalToHex(value.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar checksum = byteStringToByteArray(value);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + value;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    idsToUpdate: idsToUpdate,\\r\\n    notSend: notSend\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction checkValue(contact) {\\r\\n    for (var d in deletedId) {\\r\\n        //if (d === contact) {\\r\\n        //    return true;\\r\\n        //}\\r\\n        if (params.ApprovedContacts[contact].Contact == paramsChanged.ApprovedContacts[d].Contact) {\\r\\n            return true;\\r\\n        }\\r\\n    }\\r\\n    return false;\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760466269}],"Tags":[]},{"Id":4923,"Name":"setMicVolume","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.MicVolume.Volume) {\n    var volume = parseInt(params.MicVolume.Volume)\n    volume = decimalToHex(volume)\n    volume = ('00' + volume).slice(-2).toUpperCase()\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '02'\nvar key = '11'\nvar messageBody = command + keyLength + key + volume\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0400' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":4922,"Name":"setWelfareCheck","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '';\r\nvar value2 = '';\r\nif (params.WelfareCheck.EnableDisableWelfareCheck == 'true') {\r\n    value += '1';\r\n    var time = params.WelfareCheck.CheckTime * 60; //in minutes\r\n    value += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n} else {\r\n    value += ('0000000000000000000000000000000' + decimalToBinary(parseInt(3600))).slice(-31); //default\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nif (params.WelfareCheck.DialWarningTime == 'true') {\r\n    value2 += '1';\r\n    var time = params.WelfareCheck.WarningTime * 60; //in minutes\r\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(time))).slice(-31);\r\n} else {\r\n    value2 += ('0000000000000000000000000000000' + decimalToBinary(parseInt(300))).slice(-31); // default\r\n}\r\nvalue2 = ('00000000' + binaryToHex(value2)).slice(-8).toUpperCase();\r\nvalue2 = changeEndianness(value2);\r\n// join both msg\r\nvalue += value2;\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '09';\r\nvar key = '57';\r\nvar totalLenght = '0B00';\r\nif (params.DeviceVersion.DeviceVersion == '2') { // command not for watch so mic to 10\r\n    command = '02';\r\n    keyLength = '02';\r\n    key = '11';\r\n    value = '10';\r\n    totalLenght = '0400';\r\n}\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4921,"Name":"setPhoneSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '00000000000000000000';\r\nif (params.PhoneSettings.SMSWhiteList == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.PhoneSettings.SilentCallMode == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.PhoneSettings.ButtonHangUp == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.PhoneSettings.WhiteList == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.PhoneSettings.AutoAnswer == 'true') {\r\n    value += '1';\r\n    if (params.PhoneSettings.AutoAnswerAfterRings) {\r\n        value += ('0000000' + decimalToBinary(parseInt(params.PhoneSettings.AutoAnswerAfterRings))).slice(-7);\r\n    } else {\r\n        value += ('0000000');\r\n    }\r\n} else {\r\n    value += '00000000';\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '33';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('')\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF)\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('')\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":4920,"Name":"setTiltAlertSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = ''\nif (params.TiltAlert.EnableDisableTiltAlert == 'true') {\n    value += '1';\n    if (params.TiltAlert.Dial == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    value += '000000';\n    if (params.TiltAlert.Angle) {\n        var angle = ('00000000' + decimalToBinary(parseInt(params.TiltAlert.Angle))).slice(-8);\n        value += angle;\n    }\n    if (params.TiltAlert.Time) {\n        var time = ('0000000000000000' + decimalToBinary(parseInt(params.TiltAlert.Time))).slice(-16);\n        value += time;\n    }\n} else {\n    value = '0';\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\nvalue = changeEndianness(value);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '55';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = changeEndianness(checksum);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[],"Tags":[]},{"Id":5814,"Name":"setVoicePromptExtra","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\n// [Length]:05 [Key]:76 [Value]:07 00 00 00\r\n//{\"musicExtend\":{\"bit29\":0,\"bit27\":0,\"bit28\":0,\"bit25\":0,\"bit26\":0,\"flagValue\":7,\"bit23\":0,\"bit24\":0,\"bit21\":0,\"bit22\":0,\"bit20\":0,\"bit9\":0,\"bit18\":0,\"bit19\":0,\"bit7\":0,\"bit16\":0,\"bit8\":0,\"bit17\":0,\"bit5\":0,\"bit14\":0,\"bit6\":0,\"bit15\":0,\"bit3\":0,\"bit4\":0,\"bit1\":1,\"bit2\":1,\"bit0\":1,\"bit12\":0,\"bit13\":0,\"bit10\":0,\"bit11\":0,\"bit30\":0,\"bit31\":0}}\r\nvar value = '07000000';\r\n/* create the bit table to use with control\r\nvar value = '';\r\nif (params.VoicePrompt.Beep == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.TiltCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Charging == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Battery == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call1 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call2 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call3 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call4 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call5 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Fall == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.SOS == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Click == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.NoMotion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Motion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Tilt == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Activity == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Find == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call6 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Time == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined  bit 20\r\nif (params.VoicePrompt.CallError == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallDisconnected == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallHang == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call7 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call8 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call9 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call10 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmComplete == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BLE == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BaseLocation == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined bit 31\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n    var newString = \"\";\r\n    for (var i = str.length - 1; i >= 0; i--) {\r\n        newString += str[i];\r\n    }\r\n    return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value); */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '76';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":10,"SendAttempts":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5814,\"Name\":\"setVoicePromptExtra\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\n// [Length]:05 [Key]:76 [Value]:07 00 00 00\\r\\n//{\\\"musicExtend\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":0,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":7,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":0,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":1,\\\"bit2\\\":1,\\\"bit0\\\":1,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\nvar value = '07000000';\\r\\n/* create the bit table to use with control\\r\\nvar value = '';\\r\\nif (params.VoicePrompt.Beep == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.TiltCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Charging == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Battery == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call1 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call2 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call3 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call4 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call5 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Fall == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.SOS == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Click == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.NoMotion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Motion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Tilt == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Activity == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Find == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call6 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Time == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined  bit 20\\r\\nif (params.VoicePrompt.CallError == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallDisconnected == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallHang == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call7 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call8 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call9 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call10 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmComplete == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BLE == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BaseLocation == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined bit 31\\r\\nvalue = reverseString(value);\\r\\n\\r\\nfunction reverseString(str) {\\r\\n    var newString = \\\"\\\";\\r\\n    for (var i = str.length - 1; i >= 0; i--) {\\r\\n        newString += str[i];\\r\\n    }\\r\\n    return newString;\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value); */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '76';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":10,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1760468897}],"Tags":[]},{"Id":5816,"Name":"actionTriggerOTA","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"// Trigger OTA\r\nvar configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create value for URL  40.91.195.192:8098\r\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\r\n// http://40.91.195.192:8098/api/fi_ota  (test server)\r\n// production server 'http://13.81.174.129:8098/api/fi_ota';\r\nif (params.Server.SetServer === '52.232.85.255,5678') {\r\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\r\n} else {\r\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\r\n}\r\nvar value = ascii_to_hexa(value).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\n// control command\r\nvar command = '04';\r\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\r\nvar key = '30';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5816,\"Name\":\"actionTriggerOTA\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"// Trigger OTA\\r\\nvar configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//create value for URL  40.91.195.192:8098\\r\\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\\r\\n// http://40.91.195.192:8098/api/fi_ota  (test server)\\r\\n// production server 'http://13.81.174.129:8098/api/fi_ota';\\r\\nif (params.Server.SetServer === '52.232.85.255,5678') {\\r\\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\\r\\n} else {\\r\\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\\r\\n}\\r\\nvar value = ascii_to_hexa(value).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\n// control command\\r\\nvar command = '04';\\r\\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\\r\\nvar key = '30';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes;\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x !== 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin;\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761682722},{"Type":1,"NewValue":"{\"Id\":5816,\"Name\":\"actionTriggerOTA\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"// Trigger OTA\\r\\nvar configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//create value for URL  40.91.195.192:8098\\r\\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\\r\\n// http://40.91.195.192:8098/api/fi_ota  (test server)\\r\\n// production server 'http://13.81.174.129:8098/api/fi_ota';\\r\\nif (params.CommunicationSettings.Server === '52.232.85.255,5678') {\\r\\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\\r\\n} else {\\r\\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\\r\\n}\\r\\nvar value = ascii_to_hexa(value).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\n// control command\\r\\nvar command = '04';\\r\\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\\r\\nvar key = '30';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes;\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x !== 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin;\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1761683092}],"Tags":[]},{"Id":5851,"Name":"getFirmwareVersion","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar value = '021A'; //Ask for firmware in both version\r\nvar command = '02';\r\nvar keyLength = '03';\r\nvar key = 'F0';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'V?';\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":5851,\"Name\":\"getFirmwareVersion\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar value = '021A'; //Ask for firmware in both version\\r\\nvar command = '02';\\r\\nvar keyLength = '03';\\r\\nvar key = 'F0';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0500' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'V?';\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1790530662}],"Tags":[]}],"Operations":[{"Id":314,"Name":"OnUpdateProtocol_CareWatch","Operation":"/*\r\nlet configsToUpdate = [];\r\nif (configs.HeartRateMonitor.EnableDisableHeartRateMonitor === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.HeartRateMonitor.EnableDisableHeartRateMonitor,\r\n        'value': 'false'\r\n    });\r\n}\r\nif (configs.HeartRateMonitor.HeartRateDetectingInterval === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.HeartRateMonitor.HeartRateDetectingInterval,\r\n        'value': '10'\r\n    });\r\n}\r\nif (configs.StepCounting.EnableDisableStepCounting === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.StepCounting.EnableDisableStepCounting,\r\n        'value': 'false'\r\n    });\r\n}\r\nif (configs.StepCounting.StepCountingInterval === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.StepCounting.StepCountingInterval,\r\n        'value': '10'\r\n    });\r\n}\r\nif (configs.DeviceVersion.DeviceVersion === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.DeviceVersion.DeviceVersion,\r\n        'value': '1'\r\n    });\r\n}\r\nif (configs.NoActivity.EnableDisableNoActivity === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.NoActivity.EnableDisableNoActivity,\r\n        'value': 'false'\r\n    });\r\n}\r\nif (configs.NoActivity.NoActivity === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.NoActivity.NoActivity,\r\n        'value': '3600'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Activity === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Activity,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.AlarmCancel === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.AlarmCancel,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.AlarmComplete === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.AlarmComplete,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.BaseLocation === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.BaseLocation,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Battery === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Battery,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Beep === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Beep,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.BLE === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.BLE,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call1 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call1,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call2 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call2,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call3 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call3,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call4 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call4,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call5 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call5,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call6 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call6,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call7 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call7,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call8 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call8,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call9 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call9,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Call10 === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Call10,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.CallDisconnected === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.CallDisconnected,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.CallError === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.CallError,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.CallHang === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.CallHang,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Charging === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Charging,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Click === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Click,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Fall === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Fall,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Find === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Find,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Motion === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Motion,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.NoMotion === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.NoMotion,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.SOS === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.SOS,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Tilt === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Tilt,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.TiltCancel === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.TiltCancel,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.VoicePrompt.Time === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.VoicePrompt.Time,\r\n        'value': 'true'\r\n    });\r\n}\r\nif (configs.EnableControl.Step === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.EnableControl.Step,\r\n        'value': 'false'\r\n    });\r\n}\r\nif (configs.SystemLanguage.Language === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.SystemLanguage.Language,\r\n        'value': 'en-US'\r\n    });\r\n}\r\nif (configs.WelfareCheck.EnableDisableWelfareCheck === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.WelfareCheck.EnableDisableWelfareCheck,\r\n        'value': 'false'\r\n    });\r\n}\r\nif (configs.WelfareCheck.CheckTime === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.WelfareCheck.CheckTime,\r\n        'value': '60'\r\n    });\r\n}\r\nif (configs.WelfareCheck.WarningTime === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.WelfareCheck.WarningTime,\r\n        'value': '10'\r\n    });\r\n}\r\nif (configs.WelfareCheck.DialWarningTime === \"\") {\r\n    configsToUpdate.push({\r\n        'code': configIds.WelfareCheck.DialWarningTime,\r\n        'value': 'false'\r\n    });\r\n}\r\nvar msg = {\r\n    'configsToUpdate': configsToUpdate\r\n};\r\nconsole.log(msg); */","Type":1,"ProtocolActionObjects":[]},{"Id":313,"Name":"Access TEC Roam","Operation":"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\r\n    ///////////////////////////////////////////////////////////////////////////////\r\n    //\r\n    // Roam protocol - please see variables and typical values in order below\r\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\r\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\",\r\n    //\r\n    // Author: Joe Bloggs\r\n    // Created: 01/01/0000\r\n    // Last modified: 12/04/2024\r\n    //\r\n    ///////////////////////////////////////////////////////////////////////////////\r\n    if (typeof localTesting === \"undefined\") {\r\n        var localTesting = \"False\";\r\n    }\r\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\r\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\r\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\r\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\r\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\r\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\r\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\r\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\r\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\r\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\r\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\r\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\r\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\r\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\r\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\r\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\r\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\r\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\r\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\r\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\r\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\r\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n    ];\r\n    var codeValues = [];\r\n    AddValue(codeValues, 'protocol_template', 'Roam');\r\n    AddValue(codeValues, 'product', serverParams.ProductName);\r\n    var dataToReceiver = [];\r\n    var configsToAck = [];\r\n    var configsToUpdate = [];\r\n    var configsToSend = [];\r\n    if (globalTemplate == \"True\") {\r\n        if (raw.startsWith('esendex')) {\r\n            AddValue(codeValues, 'rawMsg', raw);\r\n            //general SMS message\r\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\r\n            sendMessageToLocalhostNoWait(messageForReceiver);\r\n            return;\r\n        }\r\n        AddValue(codeValues, 'raw', raw);\r\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\r\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\r\n        var homeBeacon = '';\r\n        var homeWiFi = '';\r\n        var contacts = '';\r\n        var gps_data = '';\r\n        var wifi_data = '';\r\n        var status_data = '';\r\n        var lbs_data = '';\r\n        var beacon_data = '';\r\n        var ble_data = '';\r\n        var smart_data = '';\r\n        //parse header & properties\r\n        var message = rawFromBytes;\r\n        var properties = message.substring(2, 4);\r\n        var lengthLittleEndian = message.substring(4, 8);\r\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\r\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\r\n        var messageForReceiver;\r\n        var sequenceID = message.substring(12, 16);\r\n        var command = message.substring(16, 18);\r\n        var index = 18;\r\n        var prefix = 'AB' + '00';\r\n        var lengthAck = 0;\r\n        var ack = '';\r\n        var needsAck = false;\r\n        var hasConfigs = false;\r\n        var general = '';\r\n        var timestamp = '';\r\n        var info = '';\r\n        var customID = '';\r\n        latitude = 0;\r\n        longitude = 0;\r\n        location_accuracy = 0; // GPS location adds the accuracy\r\n        location_time = event_time = '';\r\n        speed = 0.0;\r\n        var location_type = '0';\r\n        //var gen_location = '0'; \r\n        var i; // general loop counter\r\n        var battery_percentage = '';\r\n        var cellNetworkSignal = '';\r\n        var workMode = '';\r\n        //mask bitwise   (properties should be '10')\r\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\r\n            needsAck = true;\r\n        }\r\n        // Loop to decode multi-ACK msg\r\n        if (message.includes('AB00030008C7')) {\r\n            const multiack = message.split('AB00');\r\n            for (let i = 1; i < multiack.length; i++) {\r\n                message = 'AB00' + multiack[i];\r\n                debug(message);\r\n                decoder(message);\r\n            } // FOR multiACK\r\n        } else decoder(message); // IF multiACK\r\n    } else if (oystaTemplate == 'True') { // Oysta Template \r\n        AddValue(codeValues, 'rawMsg', raw);\r\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\r\n            var gen_location = params.gps_data.split(',');\r\n            var latitude = gen_location[0];\r\n            var longitude = gen_location[1];\r\n            var location_accuracy = gen_location[2];\r\n            var speed = gen_location[3];\r\n            var direction = gen_location[4];\r\n            var altitude = gen_location[5];\r\n            var satellites = gen_location[6];\r\n            var mileage = gen_location[7];\r\n            if (location_accuracy !== 0) {\r\n                var fix_state = 1;\r\n            } else {\r\n                var fix_state = 0;\r\n            }\r\n            AddValue(codeValues, 'latitude', latitude);\r\n            AddValue(codeValues, 'longitude', longitude);\r\n            AddValue(codeValues, 'speed', speed);\r\n            AddValue(codeValues, 'direction', direction);\r\n            AddValue(codeValues, 'altitude', altitude);\r\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\r\n            AddValue(codeValues, 'mileage', mileage);\r\n            AddValue(codeValues, 'satellites', satellites);\r\n            AddValue(codeValues, 'fix_state', fix_state);\r\n            if (location_time) {\r\n                AddValue(codeValues, 'location_time', location_time);\r\n            }\r\n        }\r\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\r\n            var variables = []; //Define array\r\n            variables = params.lbs_data.split(',');\r\n            var index = 2;\r\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\r\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\r\n                    AddValue(codeValues, 'mcc', variables[0]);\r\n                    AddValue(codeValues, 'mnc', variables[1]);\r\n                    AddValue(codeValues, 'lac', variables[index]);\r\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\r\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\r\n                }\r\n                index += 3;\r\n            }\r\n            if (location_time) {\r\n                AddValue(codeValues, 'location_time', location_time);\r\n            }\r\n        }\r\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\r\n            var bssid_array = params.wifi_data.split(',');\r\n            var index = 0;\r\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\r\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\r\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\r\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\r\n                }\r\n                index += 2;\r\n            }\r\n            if (location_time) {\r\n                AddValue(codeValues, 'location_time', location_time);\r\n            }\r\n        }\r\n        //  when Beacon is detected and it isn't flic BLE detected\r\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\r\n            var gen_location = params.beacon_data.split(',');\r\n            var latitude = gen_location[0];\r\n            var longitude = gen_location[1];\r\n            var mac = gen_location[2];\r\n            var label = gen_location[3];\r\n            AddValue(codeValues, 'latitude', latitude);\r\n            AddValue(codeValues, 'longitude', longitude);\r\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\r\n            // AddValue(codeValues,'beacon_mac', mac);\r\n            //AddValue(codeValues,'beacon_major', 0);\r\n            //AddValue(codeValues,'beacon_minor', 0);\r\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \r\n            if (mac) {\r\n                AddValue(codeValues, 'beacon_mac', mac);\r\n                var simpleQuery = [{\r\n                    'code': 'Mac',\r\n                    'value': mac,\r\n                }];\r\n                var simpleQueryLabel = {\r\n                    'table': 'beacons',\r\n                    'select': 'Name',\r\n                    'query': simpleQuery\r\n                };\r\n                var labels = [];\r\n                labels.push(JSON.stringify(simpleQueryLabel));\r\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\r\n            }\r\n            if (params.beacon_major) {\r\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\r\n            } else {\r\n                AddValue(codeValues, 'beacon_major', 0);\r\n            }\r\n            if (params.beacon_minor) {\r\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\r\n            } else {\r\n                AddValue(codeValues, 'beacon_minor', 0);\r\n            }\r\n            //AddValue(codeValues,'oysta_labels', label);\r\n            //AddValue(codeValues,'oysta_value', mac);\r\n            if (location_time) {\r\n                AddValue(codeValues, 'location_time', location_time);\r\n            }\r\n        }\r\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\r\n            var gen_location = params.ble_data.split(',');\r\n            var flag = gen_location[0];\r\n            var batLevel = gen_location[1];\r\n            var mac2 = gen_location[2];\r\n            //var label = gen_location[3];\r\n            AddValue(codeValues, 'flagBLE', flag);\r\n            AddValue(codeValues, 'batBLE', batLevel);\r\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\r\n            // AddValue(codeValues,'beacon_mac', mac);\r\n            //AddValue(codeValues,'beacon_major', 0);\r\n            //AddValue(codeValues,'beacon_minor', 0);\r\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \r\n            if (mac2) {\r\n                AddValue(codeValues, 'beacon_mac', mac2);\r\n                var simpleQuery2 = [{\r\n                    'code': 'Mac',\r\n                    'value': mac2,\r\n                }];\r\n                var simpleQueryLabel2 = {\r\n                    'table': 'beacons',\r\n                    'select': 'Name',\r\n                    'query': simpleQuery2\r\n                };\r\n                var labels2 = [];\r\n                labels2.push(JSON.stringify(simpleQueryLabel2));\r\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\r\n            }\r\n            if (params.beacon_major) {\r\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\r\n            } else {\r\n                AddValue(codeValues, 'beacon_major', 0);\r\n            }\r\n            if (params.beacon_minor) {\r\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\r\n            } else {\r\n                AddValue(codeValues, 'beacon_minor', 0);\r\n            }\r\n            //AddValue(codeValues,'oysta_labels', label);\r\n            //AddValue(codeValues,'oysta_value', mac);\r\n            if (location_time) {\r\n                AddValue(codeValues, 'location_time', location_time);\r\n            }\r\n        }\r\n        /*  meter mas tarde...   \r\n            if (params.smart_data !== 'undefined') {\r\n                var gen_location = params.smart_data.split(',')\r\n                var latitude = gen_location[0]\r\n                var longitude = gen_location[1]\r\n                var location_accuracy = gen_location[2]\r\n                var altitude = gen_location[3]\r\n                AddValue(codeValues,'latitude', latitude);\r\n                AddValue(codeValues,'longitude', longitude);\r\n                AddValue(codeValues,'altitude', altitude);\r\n                AddValue(codeValues,'location_accuracy', location_accuracy);\r\n            }\r\n          */\r\n        /*else if ((params.event_time) && (params.event_time == '')) {\r\n            var event_time = moment.utc().unix();\r\n            AddValue(codeValues,'event_time', event_time);\r\n        }  revisar mas adelante*/\r\n        // to parse SMS info from the device\r\n        switch (messageTypeLocalCode) {\r\n            case 'COMM-SMS': // SMS message sent in\r\n                if (params.data.startsWith('Device location request')) {\r\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\r\n                } else if (params.data.startsWith('Set IP ok')) {\r\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\r\n                } else if (params.data.startsWith('IMEI:')) {\r\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\r\n                } else if (params.data.startsWith('Set IP ok')) {\r\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\r\n                } else if (params.data.startsWith('flush ok')) {\r\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\r\n                } else if (params.data.startsWith('Set Roam-')) {\r\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\r\n                } else if (params.data.startsWith('set live tracking')) {\r\n                    configsToAck.push(configIds.Controls.Trace);\r\n                } else if (params.data.startsWith('reboot ok')) {\r\n                    configsToAck.push(configIds.Controls.Reboot);\r\n                } else if (params.data.startsWith('GPS')) {\r\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\r\n                    var i1 = params.data.search('Now:')\r\n                    var i2 = params.data.search('Loc Time:')\r\n                    var i3 = params.data.search('Speed:')\r\n                    var i4 = params.data.search('Altitude:')\r\n                    var i5 = params.data.search('Battery:')\r\n                    var i6 = params.data.search('google')\r\n                    var eventTime = params.data.substring(i2 + 9, i3)\r\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\r\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\r\n                        Speed = Speed * 0.44704\r\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\r\n                        Speed = Speed / 3.6\r\n                    }\r\n                    var latlong = params.data.substring(i6 + 18)\r\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\r\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\r\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\r\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\r\n                    sendMessageToLocalhostNoWait(messageForReceiver);\r\n                }\r\n                break;\r\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\r\n                //var i1 = params.data.search('IMEI:')\r\n                //var i2 = params.data.search('GSM signal quality:')\r\n                var i3 = params.data.search('Software version:')\r\n                var sub = params.data.substring(i3 + 17, params.data.length)\r\n                var i4 = sub.search('version:');\r\n                var fwVersion = sub.substring(i4, sub.length);\r\n                imei = serverParams.Imei;\r\n                AddValue(codeValues, \"imei\", imei);\r\n                AddValue(codeValues, \"fwVersion\", fwVersion);\r\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\r\n                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\r\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\r\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\r\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\r\n                break;\r\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\r\n                var i1 = params.data.search('Fall alarm:');\r\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\r\n                var i2 = params.data.search('level:');\r\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\r\n                imei = serverParams.Imei;\r\n                AddValue(codeValues, \"imei\", imei);\r\n                AddValue(codeValues, \"sensibility\", sensibility);\r\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\r\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\r\n                break;\r\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\r\n                var i1 = raw.search('1,');\r\n                //var i2 = params.data.search('2,');\r\n                //var homeBeacon = params.data.substring(i1+2, i2);\r\n                imei = serverParams.Imei;\r\n                AddValue(codeValues, \"imei\", imei);\r\n                AddValue(codeValues, \"homeBeacon\", raw.substring(i1, raw.length));\r\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\r\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\r\n                break;\r\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\r\n                imei = serverParams.Imei;\r\n                AddValue(codeValues, \"imei\", imei);\r\n                var i1 = raw.search('A1:');\r\n                if (raw.includes('A2:')) {\r\n                    var i2 = raw.search('A2:');\r\n                } else {\r\n                    var i2 = raw.search('A10:');\r\n                }\r\n                var tel = raw.substring(i1 + 4, i2);\r\n                AddValue(codeValues, \"EmergencyNumber\", tel);\r\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\r\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\r\n                i2 = raw.search('A10:')\r\n                tel = raw.substring(i2 + 4, raw.length);\r\n                AddValue(codeValues, \"SMSGateway\", tel);\r\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\r\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\r\n                AddValue(codeValues, \"ApprovedContacts\", raw.substring(i1, raw.length));\r\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\r\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\r\n                break;\r\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\r\n                imei = serverParams.Imei;\r\n                AddValue(codeValues, \"imei\", imei);\r\n                var i1 = params.data.search('APN:')\r\n                var i2 = params.data.search('IP:')\r\n                var i3 = params.data.search('Move')\r\n                var apn = params.data.substring(i1 + 4, i2);\r\n                AddValue(codeValues, \"apn\", apn);\r\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\r\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\r\n                var serverDetails = params.data.substring(i2 + 3, i3);\r\n                AddValue(codeValues, \"server\", serverDetails);\r\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\r\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\r\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\r\n                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                break;\r\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\r\n                var i3 = params.data.search('Speed:')\r\n                var i4 = params.data.search('Altitude:')\r\n                var i5 = params.data.search('Battery:')\r\n                var i6 = params.data.search('google')\r\n                var eventTime = params.data.substring(0, i3)\r\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\r\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\r\n                    Speed = Speed * 0.44704\r\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\r\n                    Speed = Speed / 3.6\r\n                }\r\n                var latlong = params.data.substring(i6 + 18)\r\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\r\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\r\n                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                break;\r\n        }\r\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \r\n            var event_time = moment.utc().unix();\r\n            AddValue(codeValues, 'event_time', event_time);\r\n        }\r\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \r\n        //    var location_time = moment.utc().unix();\r\n        //    AddValue(codeValues, 'location_time', location_time);\r\n        //}\r\n    }\r\n    var dataToReceiver = {\r\n        'values': codeValues\r\n    };\r\n    if (configsToAck.length > 0) {\r\n        dataToReceiver.configsToAck = configsToAck\r\n    };\r\n    if (configsToUpdate.length > 0) {\r\n        dataToReceiver.configsToUpdate = configsToUpdate\r\n    };\r\n    if (configsToSend.length > 0) {\r\n        dataToReceiver.configsToSend = configsToSend\r\n    };\r\n    console.log(dataToReceiver);\r\n    //}\r\n    //return {\r\n    //    'output': dataToReceiver\r\n    //}\r\n    // end of main operation\r\n    // define functions used in operation\r\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\r\n        var cvpair = {\r\n            code: p1,\r\n            value: p2\r\n        };\r\n        codeValueArray.push(cvpair);\r\n    }\r\n\r\n    function decoder(str) { // decode rawdata\r\n        // CARE Decoder\r\n        AddValue(codeValues, 'Message : ', str);\r\n        var message = str;\r\n        // need to check if checksum is correct for possible msg corruption  10/03/23\r\n        var checksum = message.substring(8, 12);\r\n        var messageBody = message.substring(16, message.length);\r\n        debug('message =' + message);\r\n        debug('checksum =' + checksum);\r\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\r\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\r\n            debug(\"message has valid checksum\");\r\n            var messageBody = command; // update value for the ACK\r\n            debug('command =' + command);\r\n            if (command == '01') {\r\n                while (index < total_length + 16) {\r\n                    // gen_location = '0'; //cambiado 30/09\r\n                    var keyLengthHex = message.substring(index, index = index + 2);\r\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\r\n                    var key = message.substring(index, index = index + 2);\r\n                    var value = message.substring(index, index = index + keyLength - 2);\r\n                    debug('key = ' + key);\r\n                    debug('value = ' + value);\r\n                    switch (key) {\r\n                        //Device ID\r\n                        case '01':\r\n                            var imei = hex_to_ascii(value);\r\n                            break;\r\n                            //Alarm code\r\n                        case '02':\r\n                            var alarm = 'CYC';\r\n                            var alarmCode = value.substring(0, 8);\r\n                            alarmCode = changeEndianness(alarmCode);\r\n                            var timestampHex = value.substring(8, 16);\r\n                            timestampHex = changeEndianness(timestampHex);\r\n                            timestamp = hexToDecimal(timestampHex);\r\n                            event_time = timestamp;\r\n                            var alarmCodeInt = hexToDecimal(alarmCode);\r\n                            var alarmCodeExt = value.substring(16, 24);\r\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\r\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\r\n                            //Extended Alerts\r\n                            // Fall off\r\n                            if ((alarmCodeExtInt & 1) == 1) {\r\n                                var alarm = 'ALF-C';\r\n                            }\r\n                            // Welfare Check-out\r\n                            else if ((alarmCodeExtInt & 2) == 2) {\r\n                                var alarm = 'ALA-C';\r\n                            }\r\n                            // Standard Alerts\r\n                            //Battery low\r\n                            else if ((alarmCodeInt & 1) == 1) {\r\n                                var alarm = 'BATL';\r\n                            }\r\n                            //Overspeed\r\n                            else if ((alarmCodeInt & 2) == 2) {\r\n                                var alarm = 'ALSP';\r\n                            }\r\n                            //Fall\r\n                            else if ((alarmCodeInt & 4) == 4) {\r\n                                var alarm = 'ALF';\r\n                            }\r\n                            //Tilt\r\n                            else if ((alarmCodeInt & 8) == 8) {\r\n                                var alarm = 'Tilt';\r\n                            } else if ((alarmCodeInt & 16) == 16) {\r\n                                if ((alarmCodeInt & 16777216) == 16777216) {\r\n                                    var alarm = 'Geo1-IN';\r\n                                } else {\r\n                                    var alarm = 'Geo1-OUT';\r\n                                }\r\n                            } else if ((alarmCodeInt & 32) == 32) {\r\n                                if ((alarmCodeInt & 33554432) == 33554432) {\r\n                                    var alarm = 'Geo2-IN';\r\n                                } else {\r\n                                    var alarm = 'Geo2-OUT';\r\n                                }\r\n                            } else if ((alarmCodeInt & 64) == 64) {\r\n                                if ((alarmCodeInt & 67108864) == 67108864) {\r\n                                    var alarm = 'Geo3-IN';\r\n                                } else {\r\n                                    var alarm = 'Geo3-OUT';\r\n                                }\r\n                            } else if ((alarmCodeInt & 128) == 128) {\r\n                                if ((alarmCodeInt & 134217728) == 134217728) {\r\n                                    var alarm = 'Geo4-IN';\r\n                                } else {\r\n                                    var alarm = 'Geo4-OUT';\r\n                                }\r\n                            }\r\n                            //Power Off\r\n                            else if ((alarmCodeInt & 256) == 256) {\r\n                                var alarm = 'PWRF';\r\n                            }\r\n                            //Power On\r\n                            else if ((alarmCodeInt & 512) == 512) {\r\n                                var alarm = 'PWRN';\r\n                            }\r\n                            //Motion\r\n                            else if ((alarmCodeInt & 1024) == 1024) {\r\n                                var alarm = 'ALMOV';\r\n                            }\r\n                            //No Motion\r\n                            else if ((alarmCodeInt & 2048) == 2048) {\r\n                                var alarm = 'ALNM';\r\n                            }\r\n                            //SOS\r\n                            else if ((alarmCodeInt & 4096) == 4096) {\r\n                                var alarm = 'ALSOS';\r\n                            } else if ((alarmCodeInt & 8192) == 8192) {\r\n                                var alarm = 'Side1';\r\n                            } else if ((alarmCodeInt & 16384) == 16384) {\r\n                                var alarm = 'Side2';\r\n                            }\r\n                            //Battery charging\r\n                            else if ((alarmCodeInt & 32768) == 32768) {\r\n                                var alarm = 'BATCN';\r\n                            }\r\n                            //Battery no charging\r\n                            else if ((alarmCodeInt & 65536) == 65536) {\r\n                                var alarm = 'BATCF';\r\n                            }\r\n                            //SOS Ending\r\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\r\n                            else if ((alarmCodeInt & 131072) == 131072) {\r\n                                var alarm = 'SOSEnding';\r\n                                info = 'Alarm Finished';\r\n                            }\r\n                            //Amber Alert  EC03 only\r\n                            else if ((alarmCodeInt & 262144) == 262144) {\r\n                                var alarm = 'ALAO';\r\n                            }\r\n                            // welfare Alert check-in ALA-O\r\n                            else if ((alarmCodeInt & 524288) == 524288) {\r\n                                var alarm = 'ALA-O';\r\n                            }\r\n                            // Amber alert Ending  ALA-C\r\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\r\n                                var alarm = 'ALA-C';\r\n                            }\r\n                            // Amber alert Ending  ALA-C\r\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\r\n                            //    var alarm = 'ALA-C';\r\n                            //}\r\n                            // Fall-Down Alert ending\r\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\r\n                                var alarm = 'ALF-C';\r\n                            }\r\n                            // welfare Alert Ending  ALA\r\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\r\n                                var alarm = 'ALA';\r\n                            }\r\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\r\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\r\n                            //    var alarm = 'BEA';\r\n                            //}\r\n                            general += 'alarm:' + alarm + ',';\r\n                            break;\r\n                            //Custom ID\r\n                        case '03':\r\n                            // in value is customID.... '06' for Watch Care\r\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\r\n                            //update customID to check if belongs to this type of device\r\n                            customID = value;\r\n                            if (value != '04') {\r\n                                AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                return\r\n                            } else {\r\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\r\n                                    sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\r\n                                }\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                general += 'customID:' + value + ',';\r\n                                break;\r\n                            }\r\n                            //Historical Data Completed\r\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\r\n                            var histData = true;\r\n                            break;\r\n                            //GPS location\r\n                        case '20':\r\n                            location_type = 'GPS';\r\n                            var latitudeHex = value.substring(0, 8);\r\n                            var longitudeHex = value.substring(8, 16);\r\n                            var speedHex = value.substring(16, 20);\r\n                            var directionHex = value.substring(20, 24);\r\n                            var altitudeHex = value.substring(24, 28);\r\n                            var location_accuracyHex = value.substring(28, 32);\r\n                            var mileageHex = value.substring(32, 40);\r\n                            var satellitesHex = value.substring(40, 42);\r\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\r\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\r\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\r\n                            var direction = hexToDecimal(changeEndianness(directionHex));\r\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\r\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\r\n                            // Range: 0.5 to 99.9  \r\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\r\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\r\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\r\n                            var satellites = hexToDecimal(satellitesHex);\r\n                            // location_time = timestamp;\r\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\r\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\r\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\r\n                            break;\r\n                            //WIFI Towers\r\n                        case '22':\r\n                            location_type = 'WIFI';\r\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\r\n                            //location_time = timestamp;\r\n                            var wifiTowers = value;\r\n                            general += 'wifiTowers:';\r\n                            var indexWifi = 0;\r\n                            var bssid_array = [];\r\n                            wifi_data = '';\r\n                            for (let i = 0; i < numWifi; i++) {\r\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\r\n                                indexWifi += 14;\r\n                            }\r\n                            wifi_data = wifi_data.slice(0, -1);\r\n                            general += wifi_data;\r\n                            break;\r\n                            //BLE Location  Added 10/10/22\r\n                        case '23':\r\n                            location_type = 'BLE';\r\n                            var mac = value.substring(0, 12);\r\n                            var latitudeHex = value.substring(12, 20);\r\n                            var longitudeHex = value.substring(20, 28);\r\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\r\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\r\n                            var address = hex_to_ascii(value.substring(28, value.length));\r\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\r\n                            // add : format in MAC\r\n                            mac = mac.match(/.{1,2}/g).join(':');\r\n                            // location_time = timestamp;\r\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\r\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\r\n                            break;\r\n                            //General Data ,  status_data\r\n                        case '24':\r\n                            //var general = 'true'\r\n                            if (customID != '04') {\r\n                                AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                return\r\n                            }\r\n                            if (alarmCode) {\r\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\r\n                            } else if (statusDevice) {\r\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\r\n                            }\r\n                            //else {\r\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\r\n                            //}\r\n                            // reset variables\r\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\r\n                            var timestampHex = value.substring(0, 8);\r\n                            timestampHex = changeEndianness(timestampHex);\r\n                            timestamp = hexToDecimal(timestampHex);\r\n                            location_time = timestamp;\r\n                            // HardCode to fix possible issue in protocol\r\n                            // event_time = timestamp; \r\n                            event_time = moment.utc().unix();\r\n                            // end of hard code\r\n                            var statusHex = changeEndianness(value.substring(8, 16));\r\n                            var statusInt = hexToDecimal(statusHex);\r\n                            var statusDevice = '';\r\n                            if ((statusInt & 1) == 1) {\r\n                                statusDevice += 'GPS,';\r\n                            }\r\n                            if ((statusInt & 2) == 2) {\r\n                                statusDevice += 'WIFISource,';\r\n                            }\r\n                            if ((statusInt & 4) == 4) {\r\n                                statusDevice += 'CellTower,';\r\n                            }\r\n                            if ((statusInt & 8) == 8) {\r\n                                statusDevice += 'BLELocation,';\r\n                            }\r\n                            //params.BatteryStatus.BatteryStatus = '1';\r\n                            if ((statusInt & 16) == 16) {\r\n                                statusDevice += 'Charging,';\r\n                                // var alarm = 'BATCN';\r\n                                //configs.BatteryStatus.BatteryStatus = '1';\r\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\r\n                                     hasConfigs = true;\r\n                                     var batteryStatus = '1';\r\n                                     var alarm = 'BATCN';\r\n                                     let configsToUpdate = [];\r\n                                     configsToUpdate.push({\r\n                                         'code': configIds.BatteryStatus.BatteryStatus,\r\n                                         'value': batteryStatus\r\n                                     });\r\n                                 }*/\r\n                            }\r\n                            if ((statusInt & 32) == 32) {\r\n                                statusDevice += 'FUllyCharged,';\r\n                                //var alarm = 'BATF';\r\n                                // configs.BatteryStatus.BatteryStatus = '3';\r\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\r\n                                     hasConfigs = true;\r\n                                     var batteryStatus = '3';\r\n                                     var alarm = 'BATF';\r\n                                     let configsToUpdate = [];\r\n                                     configsToUpdate.push({\r\n                                         'code': configIds.BatteryStatus.BatteryStatus,\r\n                                         'value': batteryStatus\r\n                                     });\r\n                                 }*/\r\n                            }\r\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\r\n                                 statusDevice += 'Not Charging,';\r\n                                 var alarm = 'BATCF';\r\n                                 //configs.BatteryStatus.BatteryStatus = '2';\r\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\r\n                                       var batteryStatus = '2';\r\n                                       var alarm = 'BATCF';\r\n                                       let configsToUpdate = [];\r\n                                       configsToUpdate.push({\r\n                                           'code': configIds.BatteryStatus.BatteryStatus,\r\n                                           'value': batteryStatus\r\n                                       });\r\n                                   }\r\n                             }*/\r\n                            if ((statusInt & 64) == 64) {\r\n                                statusDevice += 'Reboot,';\r\n                            }\r\n                            if ((statusInt & 128) == 128) {\r\n                                statusDevice += 'HistoricalData,';\r\n                            }\r\n                            if ((statusInt & 256) == 256) {\r\n                                statusDevice += 'AGPSDataValid,';\r\n                            }\r\n                            if ((statusInt & 512) == 512) {\r\n                                statusDevice += 'Motion,';\r\n                            }\r\n                            if ((statusInt & 1024) == 1024) {\r\n                                statusDevice += 'SmartLocating,';\r\n                            }\r\n                            if ((statusInt & 2048) == 2048) { //isHome\r\n                                statusDevice += 'BeaconLocation,';\r\n                            }\r\n                            if ((statusInt & 4096) == 4096) {\r\n                                statusDevice += 'BLEConnected,';\r\n                            }\r\n                            if ((statusInt & 16384) == 16384) {\r\n                                statusDevice += 'HomeWiFi,';\r\n                            }\r\n                            statusDevice = statusDevice.slice(0, -1);\r\n                            status_data = statusDevice; //to oysta template\r\n                            //statusHex = (statusHex);\r\n                            statusHex = hex2bin(statusHex);\r\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\r\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\r\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\r\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\r\n                            general += 'statusDevice:' + statusDevice + ',';\r\n                            if (battery_percentage) {\r\n                                general += 'battery:' + battery_percentage + ',';\r\n                            }\r\n                            if (cellNetworkSignal) {\r\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\r\n                            }\r\n                            if (workMode) {\r\n                                general += 'workMode:' + workMode + ',';\r\n                            }\r\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\r\n                            break;\r\n                            //Call Records\r\n                        case '25':\r\n                            //Needed?\r\n                            break;\r\n                            //BLE Location 2\r\n                        case '26':\r\n                            //I don't understand\r\n                            //messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                            //Smart Location\r\n                        case '27':\r\n                            location_type = 'SMART';\r\n                            var latitudeHex = value.substring(0, 8);\r\n                            var longitudeHex = value.substring(8, 16);\r\n                            var location_accuracyHex = value.substring(16, 20);\r\n                            var altitudeHex = value.substring(20, 24);\r\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\r\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\r\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\r\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\r\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\r\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\r\n                            //location_time = timestamp;\r\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\r\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\r\n                            break;\r\n                            //Beacon Location  Added 11/10/22\r\n                        case '28':\r\n                            location_type = 'BEACON';\r\n                            // var alarm = 'EBZI';\r\n                            var latitudeHex = '00';\r\n                            var longitudeHex = '00';\r\n                            var descr = 'empty';\r\n                            var flag = hexToDecimal(value.substring(0, 1));\r\n                            var beacId = hexToDecimal(value.substring(1, 2));\r\n                            // msg includes descrip\r\n                            if ((flag & 4) == 4) {\r\n                                descr = hex_to_ascii(value.substring(18, value.length));\r\n                            }\r\n                            // msg includes lat/lon\r\n                            if ((flag & 8) == 8) {\r\n                                latitudeHex = value.substring(18, 26);\r\n                                longitudeHex = value.substring(26, 34);\r\n                            }\r\n                            // msg includes lat/lon and description\r\n                            if ((flag & 12) == 12) {\r\n                                latitudeHex = value.substring(18, 26);\r\n                                longitudeHex = value.substring(26, 34);\r\n                                descr = hex_to_ascii(value.substring(34, value.length));\r\n                            }\r\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\r\n                            // add : format in MAC\r\n                            mac = mac.match(/.{1,2}/g).join(':');\r\n                            var rssiHex = value.substring(14, 16);\r\n                            var rssi1Hex = value.substring(16, 18);\r\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\r\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\r\n                            // var latitudeHex = value.substring(18, 26);\r\n                            // var longitudeHex = value.substring(26, 34);\r\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\r\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\r\n                            //location_time = timestamp;\r\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\r\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\r\n                            break;\r\n                            // Beacon V2\r\n                        case '2C':\r\n                            location_type = 'BEACON';\r\n                            // var alarm = 'EBZI';\r\n                            var latitudeHex = '00';\r\n                            var longitudeHex = '00';\r\n                            var descr = 'empty';\r\n                            var flag = hexToDecimal(value.substring(0, 1));\r\n                            var beacId = hexToDecimal(value.substring(1, 2));\r\n                            // msg includes descrip\r\n                            if ((flag & 4) == 4) {\r\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\r\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\r\n                                //descr = hex_to_ascii(value.substring(18, value.length));\r\n                            }\r\n                            // msg includes lat/lon\r\n                            if ((flag & 8) == 8) {\r\n                                latitudeHex = value.substring(18, 26);\r\n                                longitudeHex = value.substring(26, 34);\r\n                            }\r\n                            // msg includes lat/lon and description\r\n                            if ((flag & 12) == 12) {\r\n                                latitudeHex = value.substring(20, 28);\r\n                                longitudeHex = value.substring(28, 36);\r\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\r\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\r\n                            }\r\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\r\n                            // add : format in MAC\r\n                            mac = mac.match(/.{1,2}/g).join(':');\r\n                            var rssiHex = value.substring(14, 16);\r\n                            var rssi1Hex = value.substring(16, 18);\r\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\r\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\r\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\r\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\r\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\r\n                            //location_time = timestamp;\r\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\r\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\r\n                            break;\r\n                            //Cell Towers Note\r\n                        case '29':\r\n                            location_type = 'LBS';\r\n                            lbs_data = '';\r\n                            var mccHex = changeEndianness(value.substring(0, 4));\r\n                            var mncHex = value.substring(4, 6);\r\n                            var mcc = hexToDecimal(mccHex);\r\n                            lbs_data += mcc + ',';\r\n                            var mnc = hexToDecimal(mncHex);\r\n                            lbs_data += mnc + ',';\r\n                            var indexLbs = 6;\r\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\r\n                            for (let i = 0; i < numTowers; i++) {\r\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\r\n                                var rxl = hexToDecimal(rxlHex);\r\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\r\n                                var lac = hexToDecimal(lacHex);\r\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\r\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\r\n                                indexLbs += 14;\r\n                            }\r\n                            lbs_data = lbs_data.slice(0, -1);\r\n                            general += lbs_data;\r\n                            break;\r\n                        case '30':\r\n                            //G-sensor. \r\n                            if (customID != '04') {\r\n                                AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                return\r\n                            }\r\n                            var numStep = (keyLength - 2) / 16;\r\n                            for (let j = 0; j < numStep; j++) {\r\n                                var timestampHex = value.substring(0, 8);\r\n                                timestampHex = changeEndianness(timestampHex);\r\n                                timestamp = hexToDecimal(timestampHex);\r\n                                //timestamp = hexToDecimalSigned(timestampHex);\r\n                                var stepHex = value.substring(8, 16);\r\n                                stepHex = changeEndianness(stepHex);\r\n                                var stepRate = hexToDecimal(stepHex);\r\n                                info = stepRate;\r\n                                //var alarmCode = 'True';\r\n                                var alarm = 'STP';\r\n                                general += ' step counting' + j + ':' + stepRate + ',';\r\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            }\r\n                            break;\r\n                            //Activity\r\n                        case '31':\r\n                            //I don't understand\r\n                            break;\r\n                            //BLE MAC list\r\n                        case '32':\r\n                            //I don't understand\r\n                            break;\r\n                            //Beacon List\r\n                        case '33':\r\n                            //I don't understand\r\n                            break;\r\n                            //Heart Rate Data\r\n                        case '40':\r\n                            if (customID != '04') {\r\n                                AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                return\r\n                            }\r\n                            var numHeartRate = (keyLength - 2) / 12;\r\n                            for (let j = 0; j < numHeartRate; j++) {\r\n                                var timestampHex = value.substring(0, 8);\r\n                                timestampHex = changeEndianness(timestampHex);\r\n                                timestamp = hexToDecimal(timestampHex);\r\n                                //timestamp = hexToDecimalSigned(timestampHex);\r\n                                var heartRateHex = value.substring(8, 10);\r\n                                var heartRate = hexToDecimal(heartRateHex);\r\n                                var trustLevelHex = value.substring(10, 12);\r\n                                var trustLevel = hexToDecimal(trustLevelHex);\r\n                                info = heartRate;\r\n                                //var alarmCode = 'True';\r\n                                var alarm = 'HRT';\r\n                                general += ' heart rate' + j + ':' + heartRate + ',';\r\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            }\r\n                            break;\r\n                            //BLE Connected  . For Flic button\r\n                        case '62':\r\n                            location_type = 'BLE';\r\n                            //var alarm = 'EBZI'; \r\n                            //var latitudeHex = '00';\r\n                            //var longitudeHex = '00';\r\n                            //var descr = 'empty';\r\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\r\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\r\n                            // add : format in MAC\r\n                            mac = mac.match(/.{1,2}/g).join(':');\r\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\r\n                            //location_time = timestamp;\r\n                            ble_data = `${flag},${batLevel},${mac}`;\r\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\r\n                            break;\r\n                    }\r\n                }\r\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\r\n                // \"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\",\r\n                if (alarmCode) {\r\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\r\n                    sendMessageToLocalhostNoWait(messageForReceiver);\r\n                } else if (statusDevice) {\r\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\r\n                    sendMessageToLocalhostNoWait(messageForReceiver);\r\n                }\r\n                /*else if (alarm === 'HRT') {\r\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\r\n                               sendMessageToLocalhostNoWait(messageForReceiver);\r\n                           } else if (alarm === 'STP') {\r\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\r\n                               sendMessageToLocalhostNoWait(messageForReceiver);\r\n                           } else {\r\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\r\n                               sendMessageToLocalhostNoWait(messageForReceiver);\r\n                           }*/\r\n                // rest the alarm value\r\n                alarm = '';\r\n            }\r\n            if (command == '02') {\r\n                while (index < total_length + 16) {\r\n                    var keyLength = message.substring(index, index = index + 2);\r\n                    keyLength = 2 * hexToDecimal(keyLength);\r\n                    var key = message.substring(index, index = index + 2);\r\n                    var value = message.substring(index, index = index + keyLength - 2);\r\n                    switch (key) {\r\n                        //Module Number\r\n                        case '01':\r\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                            //Firmware version\r\n                        case '02':\r\n                            //no ACK need\r\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\r\n                            imei = serverParams.Imei;\r\n                            AddValue(codeValues, \"imei\", imei);\r\n                            AddValue(codeValues, \"fwVersion\", fwVersion);\r\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\r\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\r\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\r\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\r\n                            //messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                        case '1A':\r\n                            //no ACK need\r\n                            var fwVersion = hex_to_ascii(value);\r\n                            imei = serverParams.Imei;\r\n                            AddValue(codeValues, \"imei\", imei);\r\n                            AddValue(codeValues, \"fwVersion\", fwVersion);\r\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\r\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\r\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\r\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\r\n                            break;\r\n                            //IMEI\r\n                        case '03':\r\n                            var imei = hexToDecimal(value);\r\n                            // harcode to avoid conflicts with Rio protocol\r\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\r\n                            //    AddValue(codeValues, \"error\", \"device imei is not in this protocol\");\r\n                            //    AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                            //AddValue(codeValues, \"IMEI\", imei);\r\n                            //    return\r\n                            //}\r\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\r\n                                sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\r\n                            }\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                            //ICCID\r\n                        case '04':\r\n                            var iccid = hexToDecimal(value);\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                            //BLE-MAC\r\n                        case '05':\r\n                            var bleMac = hexToDecimal(value);\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                            //Run Time\r\n                        case '07':\r\n                            var runTime = hexToDecimal(value);\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                        case '10': // Ringer Volume\r\n                            var volume = hexToDecimal(value);\r\n                            imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"Volume\", volume);\r\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\r\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\r\n                            break;\r\n                        case '0A': //Performance  mode\r\n                            //var workMode = hexToDecimal(value);\r\n                            //messageBody = messageBody + keyLengthHex + key + value;\r\n                            //AddValue(codeValues, \"WorkMode\", workMode);\r\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\r\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\r\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\r\n                            //var workMode = hexToDecimal(value);\r\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\r\n                            var workMode = 1234; // + value + \"end\";\r\n                            //var workModeVal = 9;\r\n                            //workMode = 'test10';\r\n                            imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\r\n                            AddValue(codeValues, \"Mode\", workMode);\r\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\r\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            //AddValue(codeValues, \"performanceMode\", performanceMode);\r\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\r\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\r\n                            break;\r\n                        case '1B':\r\n                            //Decimal o ascii?\r\n                            var gsmModule = hexToDecimal(value);\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                        case '1F':\r\n                            //System Language\r\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\r\n                            imei = serverParams.Imei;\r\n                            //messageBody = messageBody + keyLengthHex + key + value;\r\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"SystemLanguage\", systemLanguage);\r\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\r\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\r\n                            break;\r\n                        case '33': // phone option\r\n                            // [Value]:83 0B 00 00 {\"phoneOption\":{\"flag_value\":2947,\"s3\":1,\"s4\":0,\"s5\":1,\"s6\":0,\"callIncoming\":0,\"rings\":3,\"s7\":0,\"toneID\":0,\"s1\":1,\"s2\":1}}\r\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\r\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\r\n                                var auto = 'true';\r\n                            } else var auto = 'false';\r\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\r\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\r\n                                allow = 'true';\r\n                            } else var allow = 'false';\r\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\r\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\r\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\r\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\r\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\r\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\r\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\r\n                            break;\r\n                        case '30': //ContactList\r\n                            var contactNumber = value.substring(1, 2);\r\n                            var telLength = hexToDecimal(value.substring(2, 4));\r\n                            var tel = '';\r\n                            switch (contactNumber) {\r\n                                // Emergency Number\r\n                                case '0':\r\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\r\n                                    AddValue(codeValues, \"EmergencyNumber\", tel);\r\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\r\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\r\n                                    break;\r\n                                    // Speed Dial Number\r\n                                case '1':\r\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\r\n                                    AddValue(codeValues, \"SpeedDialNumber\", tel);\r\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\r\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\r\n                                    break;\r\n                                    // Gateway Number\r\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\r\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\r\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\r\n                                        tel = 'Esendex UK'\r\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\r\n                                        tel = 'Esendex Spain'\r\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\r\n                                        tel = 'Esendex UK Acceptance'\r\n                                    } else {\r\n                                        tel = 'Default'\r\n                                    }\r\n                                    AddValue(codeValues, \"SMSGateway\", tel);\r\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\r\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\r\n                                    break;\r\n                                default:\r\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\r\n                                    if (tel.length < 6) {\r\n                                        break;\r\n                                    }\r\n                                    contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\r\n                                    AddValue(codeValues, \"ApprovedContacts\", contacts);\r\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\r\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\r\n                                    break;\r\n                            }\r\n                            break;\r\n                        case '40': // APN\r\n                            //no ACK need\r\n                            var apn = hex_to_ascii(value.substring(0, value.length));\r\n                            imei = serverParams.Imei;\r\n                            break;\r\n                        case '41': // APN Username\r\n                            //no ACK need\r\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\r\n                            break;\r\n                        case '42': // APN Password\r\n                            //no ACK need\r\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\r\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"apn\", apn);\r\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\r\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\r\n                            break;\r\n                        case '43': //Server Details\r\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\r\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\r\n                            if (serverDetails.includes('52.232.85.255:5678')) {\r\n                                serverDetails = 'Production'\r\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\r\n                                serverDetails = 'Acceptance'\r\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\r\n                                serverDetails = 'Protocol-Import'\r\n                            } else {\r\n                                serverDetails = 'Default'\r\n                            }\r\n                            AddValue(codeValues, \"server\", serverDetails);\r\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\r\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\r\n                            break;\r\n                        case '44': //time interval - work mode intervals\r\n                            imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\r\n                            var workMode = 0;\r\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\r\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\r\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\r\n                                //workMode = 'High Frequency';\r\n                                workMode = 3;\r\n                            }\r\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\r\n                                //workMode = 'Balanced';\r\n                                workMode = 2;\r\n                            }\r\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\r\n                                //workMode = 'Power Saving';\r\n                                workMode = 1;\r\n                            }\r\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\r\n                                //workMode = 'No Reporting';\r\n                                workMode = 0;\r\n                            }\r\n                            AddValue(codeValues, \"Mode\", workMode);\r\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\r\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            break;\r\n                        case '47': // Custom Id\r\n                            imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"customeid\", value);\r\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\r\n                            configsToAck.push(configIds.ReadState.CustomId);\r\n                            break;\r\n                        case '53': // Non motion alert\r\n                            //2B020080\r\n                            var status = hex2bin(value.substring(6, 8));\r\n                            var alertSetting = '';\r\n                            var enableDisable = '';\r\n                            if (status.substring(0, 1) == '1') {\r\n                                alertSetting = 'Enable, '\r\n                                enableDisable = '1';\r\n                            } else {\r\n                                alertSetting = 'Disable, '\r\n                            };\r\n                            //if (status.substring(5, 6) == '1') {\r\n                            //    alertSetting += 'Dial, '\r\n                            //} else {\r\n                            //    alertSetting += 'No Dial, '\r\n                            //};\r\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\r\n                            alertSetting += time;\r\n                            imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"nomotion\", alertSetting);\r\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\r\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\r\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\r\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\r\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\r\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\r\n                            break;\r\n                        case '56': //Fall down sensibility\r\n                            // '00001100'\r\n                            var fallStatus = hex2bin(value.substring(0, 2));\r\n                            var enalbleDisable = '';\r\n                            //if (fallStatus.substring(4, 5) == '1') {\r\n                            if (fallStatus.substring(0, 1) == '1') {\r\n                                var sensibility = 'Enable, '\r\n                                enalbleDisable = '1'\r\n                            } else {\r\n                                var sensibility = 'Disable, '\r\n                            };\r\n                            if (fallStatus.substring(5, 6) == '1') {\r\n                                sensibility += 'Dial, '\r\n                            } else {\r\n                                sensibility += 'No Dial, '\r\n                            };\r\n                            var imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\r\n                            sensibility += sesibityOptionValue;\r\n                            AddValue(codeValues, \"sensibility\", sensibility);\r\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\r\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\r\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\r\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\r\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\r\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\r\n                            break;\r\n                        case '73': //BeaconList\r\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\r\n                            var beaconStatus = hex2bin(value.substring(0, 1));\r\n                            //if (beaconStatus.substring(4, 5) == '1') {\r\n                            //    homeBeacon += ' Enable, '\r\n                            //} else {\r\n                            //    homeBeacon += ' Disable, '\r\n                            //};\r\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\r\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\r\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\r\n                            AddValue(codeValues, \"homeBeacon\", homeBeacon);\r\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\r\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\r\n                            break;\r\n                        case '4A': //Wifi Network List\r\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\r\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\r\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\r\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\r\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\r\n                            /var homeWifi = '';\r\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\r\n                                if (wifiStatus == '8') {\r\n                                    homeWifi += ' Enable, '\r\n                                    enalbleDisable = '1';\r\n                                } else {\r\n                                    homeWifi += ' Disable, '\r\n                                    //enalbleDisable = '0';\r\n                                };*/\r\n                            if (wifiStatus == '8') {\r\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\r\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\r\n                                var imei = serverParams.Imei;\r\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\r\n                                AddValue(codeValues, \"wifi\", homeWiFi);\r\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\r\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\r\n                            }\r\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\r\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\r\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\r\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\r\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\r\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\r\n                            break;\r\n                        case '21': // Speed Dial Settings\r\n                            // [Value]:53 84 {\"call1Button\":{\"mode\":0,\"feedBack\":3,\"task\":2,\"time\":20,\"status\":1}}\r\n                            var status = hex2bin(value.substring(2, 3));\r\n                            var alertSetting = '';\r\n                            var enableDisable = '';\r\n                            if (status.substring(0, 1) == '1') {\r\n                                alertSetting = 'Enable, '\r\n                                enableDisable = '1';\r\n                            } else {\r\n                                alertSetting = 'Disable, '\r\n                                //enableDisable = '0';\r\n                            };\r\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\r\n                            //alertSetting += time;\r\n                            imei = serverParams.Imei;\r\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            AddValue(codeValues, \"speed\", alertSetting);\r\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\r\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\r\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\r\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\r\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\r\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n            if (command == '03') {\r\n                while (index < total_length + 16) {\r\n                    var keyLengthHex = message.substring(index, index = index + 2);\r\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\r\n                    var key = message.substring(index, index = index + 2);\r\n                    var value = message.substring(index, index = index + keyLength - 2);\r\n                    debug('key = ' + key);\r\n                    debug('value = ' + value);\r\n                    switch (key) {\r\n                        case '01': // Device ID\r\n                            var imei = hex_to_ascii(value);\r\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\r\n                                sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\r\n                            }\r\n                            break;\r\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\r\n                            /* case '03':\r\n                                //update customID to check if belongs to this type of device\r\n                                customID = value;\r\n                                if (value != '04') {\r\n                                    AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                    AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                    AddValue(codeValues, \"customID\", value);\r\n                                    return\r\n                                } else {\r\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\r\n                                        sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");\r\n                                    }\r\n                                    AddValue(codeValues, \"customID\", value);\r\n                                    general += 'customID:' + value + ',';\r\n                                    break;\r\n                                }\r\n                                break; */\r\n                        case '10': // Heartbeat\r\n                            var heartbeat = hex_to_ascii(value);\r\n                            event_time = moment.utc().unix();\r\n                            if (index < total_length + 16) {\r\n                                var keyLengthHex = message.substring(index, index = index + 2);\r\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\r\n                                key = message.substring(index, index = index + 2);\r\n                                if (key == '24') {\r\n                                    //     debug('key: ' + key) //comment those out\r\n                                    value = message.substring(index, index = index + keyLength - 2);\r\n                                    //    debug(value)\r\n                                    var timestampHex = value.substring(0, 8);\r\n                                    //    debug('timestampt hex: ' + timestampHex)\r\n                                    timestampHex = changeEndianness(timestampHex);\r\n                                    timestamp = hexToDecimal(timestampHex);\r\n                                    event_time = timestamp;\r\n                                    //    debug(event_time)\r\n                                    var statusHex = changeEndianness(value.substring(8, 16));\r\n                                    //    debug(statusHex)\r\n                                    var statusInt = hexToDecimal(statusHex);\r\n                                    var statusDevice = '';\r\n                                    if ((statusInt & 1) == 1) {\r\n                                        statusDevice += 'GPS,';\r\n                                    }\r\n                                    if ((statusInt & 2) == 2) {\r\n                                        statusDevice += 'WIFISource,';\r\n                                    }\r\n                                    if ((statusInt & 4) == 4) {\r\n                                        statusDevice += 'CellTower,';\r\n                                    }\r\n                                    if ((statusInt & 8) == 8) {\r\n                                        statusDevice += 'BLELocation,';\r\n                                    }\r\n                                    if ((statusInt & 16) == 16) {\r\n                                        statusDevice += 'Charging,';\r\n                                    }\r\n                                    if ((statusInt & 32) == 32) {\r\n                                        statusDevice += 'FUllyCharged,';\r\n                                    }\r\n                                    if ((statusInt & 64) == 64) {\r\n                                        statusDevice += 'Reboot,';\r\n                                    }\r\n                                    if ((statusInt & 128) == 128) {\r\n                                        statusDevice += 'HistoricalData,';\r\n                                    }\r\n                                    if ((statusInt & 256) == 256) {\r\n                                        statusDevice += 'AGPSDataValid,';\r\n                                    }\r\n                                    if ((statusInt & 512) == 512) {\r\n                                        statusDevice += 'Motion,';\r\n                                    }\r\n                                    if ((statusInt & 1024) == 1024) {\r\n                                        statusDevice += 'SmartLocating,';\r\n                                    }\r\n                                    if ((statusInt & 2048) == 2048) {\r\n                                        statusDevice += 'BeaconLocation,';\r\n                                    }\r\n                                    if ((statusInt & 4096) == 4096) {\r\n                                        statusDevice += 'BLEConnected,';\r\n                                    }\r\n                                    statusDevice = statusDevice.slice(0, -1);\r\n                                    //   debug('statusHex:' + statusHex)\r\n                                    statusHex = (statusHex);\r\n                                    statusHex = hex2bin(statusHex);\r\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\r\n                                    //    debug(statusHex)\r\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\r\n                                    //    debug(battery_percentage)\r\n                                    //    debug(battery_percentage)\r\n                                    //    debug(statusHex.substring(8, 13))\r\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\r\n                                    //    debug(cellNetworkSignal)\r\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\r\n                                    //    debug(workMode)\r\n                                    general += 'statusDevice:' + statusDevice + ';';\r\n                                    if (battery_percentage) {\r\n                                        general += 'battery:' + battery_percentage + ';';\r\n                                    }\r\n                                    if (cellNetworkSignal) {\r\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\r\n                                    }\r\n                                    if (workMode) {\r\n                                        general += 'workMode:' + workMode + ';';\r\n                                    }\r\n                                }\r\n                            }\r\n                            // revisar\r\n                            var gen_location = '0';\r\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\r\n                            /*if (customID != '04') {\r\n                                AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                return\r\n                            }*/\r\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\r\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            //messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                        case '12': // Device requesting timestamp\r\n                            timestamp = moment.utc().unix();\r\n                            timestampHex = decimalToHex(timestamp);\r\n                            timestampHex = changeEndianness(timestampHex);\r\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\r\n                            // respond to device with the timestamp of the server\r\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\r\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\r\n                            sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            break;\r\n                        case '21': //Cell Towers\r\n                            var mccHex = value.substring(0, 2);\r\n                            var mncHex = value.substring(2, 3);\r\n                            var mcc = hexToDecimal(mccHex);\r\n                            var mnc = hexToDecimal(mncHex);\r\n                            var numTowers = (keyLength - 4) / 5;\r\n                            var cellTowers = hex_to_ascii(value);\r\n                            messageBody = messageBody + keyLengthHex + key + value;\r\n                            break;\r\n                        case '22': // WIFI locations \r\n                            location_type = 'WIFI';\r\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\r\n                            //location_time = timestamp;\r\n                            var wifiTowers = value;\r\n                            general += 'wifiTowers:';\r\n                            var indexWifi = 0;\r\n                            var bssid_array = [];\r\n                            gen_location = '';\r\n                            for (let i = 0; i < numWifi; i++) {\r\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\r\n                                indexWifi += 14;\r\n                            }\r\n                            gen_location = gen_location.slice(0, -1);\r\n                            general += gen_location;\r\n                            //CustomID is not provided so far with command type 03\r\n                            /*if (customID != '04') {\r\n                                AddValue(codeValues, \"error\", \"customID not belongs to this protocol\");\r\n                                //AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n                                AddValue(codeValues, \"customID\", value);\r\n                                return\r\n                            }*/\r\n                            if (alarmCode) {\r\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            } else if (statusDevice) {\r\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            } else {\r\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\r\n                                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                            }\r\n                            alarmCode = '';\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n            if (command == '04') {\r\n                while (index < total_length + 16) {\r\n                    var keyLength = message.substring(index, index = index + 2);\r\n                    keyLength = 2 * hexToDecimal(keyLength);\r\n                    var key = message.substring(index, index = index + 2);\r\n                    var value = message.substring(index, index = index + keyLength - 2);\r\n                }\r\n            }\r\n            if (command == '7E') {\r\n                while (index < total_length + 16) {\r\n                    var keyLength = message.substring(index, index = index + 2);\r\n                    keyLength = 2 * hexToDecimal(keyLength);\r\n                    var key = message.substring(index, index = index + 2);\r\n                    var value = message.substring(index, index = index + keyLength - 2);\r\n                }\r\n            }\r\n            if (command == '7F') {\r\n                // while (index < total_length + 16) {\r\n                var keyLength = message.substring(index, index = index + 2);\r\n                keyLength = 2 * hexToDecimal(keyLength);\r\n                var key = message.substring(index, index = index + 2);\r\n                imei = serverParams.Imei;\r\n                AddValue(codeValues, \"imei\", imei);\r\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\r\n                sendMessageToLocalhostNoWait(messageForReceiver);\r\n                var value = message.substring(index, index = index + keyLength - 2);\r\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\r\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\r\n                //}\r\n            }\r\n            if (command == 'FE') {\r\n                while (index < total_length + 16) {\r\n                    var keyLength = message.substring(index, index = index + 2);\r\n                    keyLength = 2 * hexToDecimal(keyLength);\r\n                    var key = message.substring(index, index = index + 2);\r\n                    var value = message.substring(index, index = index + keyLength - 2);\r\n                }\r\n            }\r\n            // prepare the ACK msg and change config if it is needed\r\n            lengthAck = messageBody.length / 2;\r\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\r\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\r\n            ////////////checksum CRC 16\r\n            var checksumAck = byteStringToByteArray(messageBody);\r\n            checksumAck = crc16byte(checksumAck);\r\n            checksumAck = decimalToHex(checksumAck);\r\n            checksumAck = ('0000' + checksumAck).slice(-4);\r\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\r\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\r\n            // To send ACK to the device previous to internal msg with parts\r\n            if (needsAck == true) {\r\n                if (messageBody.length <= 2) {\r\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\r\n                } else {\r\n                    ack = prefix + messageBody;\r\n                }\r\n                AddValue(codeValues, 'imei', imei);\r\n                AddValue(codeValues, 'ack', ack);\r\n            }\r\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \r\n            AddValue(codeValues, \"error\", \"checksum failed for message\");\r\n            AddValue(codeValues, \"rawFromBytes\", rawFromBytes);\r\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\r\n            if (i >= 0) {\r\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\r\n                AddValue(codeValues, \"imei\", imei);\r\n            }\r\n        }\r\n    }\r\n\r\n    function ascii_to_hexa(str) { // ascii to hex \r\n        var arr1 = [];\r\n        for (var n = 0, l = str.length; n < l; n++) {\r\n            var hex = Number(str.charCodeAt(n)).toString(16);\r\n            arr1.push(hex);\r\n        }\r\n        return arr1.join('');\r\n    }\r\n\r\n    function byteStringToByteArray(str) { //\r\n        var splitStr = [];\r\n        var j = 0;\r\n        for (let i = 0; i < str.length; i += 2) {\r\n            splitStr[j] = str.substring(i, i + 2);\r\n            j++;\r\n        }\r\n        var bytes = [];\r\n        var bytePos = 0;\r\n        for (let i = 0; i < splitStr.length; i++) {\r\n            var byteStr = splitStr[i];\r\n            var b = parseInt(byteStr, 16);\r\n            if (b < 256) {\r\n                bytes[bytePos] = b;\r\n                bytePos++;\r\n            }\r\n        }\r\n        return bytes;\r\n    }\r\n\r\n    function changeEndianness(string) { //\r\n        const result = [];\r\n        let len = string.length - 2;\r\n        while (len >= 0) {\r\n            result.push(string.substr(len, 2));\r\n            len -= 2;\r\n        }\r\n        return result.join('');\r\n    }\r\n\r\n    function hex2bin(hex) { //\r\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\r\n    }\r\n\r\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\r\n        var checksum = byteStringToByteArray(payloadData);\r\n        checksum = crc16byte(checksum);\r\n        checksum = decimalToHex(checksum);\r\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\r\n        return changeEndianness(checksum);\r\n    }\r\n\r\n    function crc16byte(s) { //\r\n        var crc = 0x0000;\r\n        var j, i;\r\n        for (i = 0; i < s.length; i++) {\r\n            c = s[i];\r\n            if (c > 255) {\r\n                throw new RangeError();\r\n            }\r\n            j = (c ^ (crc >> 8)) & 0xFF;\r\n            crc = crcTable[j] ^ (crc << 8);\r\n        }\r\n        return ((crc ^ 0) & 0xFFFF);\r\n    }\r\n\r\n    function debug(str) { // write debug info to console log, if localTesting\r\n        if (localTesting === \"True\") {\r\n            console.log(str);\r\n        }\r\n    }\r\n\r\n    function decimalToHex(x) { // decimal to hex\r\n        x = x.toString(16).toUpperCase();\r\n        return x;\r\n    }\r\n\r\n    function hex_to_ascii(str1) { // Hex to Ascii \r\n        var hex = str1.toString();\r\n        var str = '';\r\n        for (var n = 0; n < hex.length; n += 2) {\r\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\r\n        }\r\n        return str;\r\n    }\r\n\r\n    function hexToDecimalSigned(hex) { // hex to decimal\r\n        if (hex.length % 2 != 0) {\r\n            hex = \"0\" + hex;\r\n        }\r\n        var num = parseInt(hex, 16);\r\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\r\n        if (num > maxVal / 2 - 1) {\r\n            num = num - maxVal;\r\n        }\r\n        return num;\r\n    }\r\n\r\n    function hexToDecimal(x) {\r\n        x = parseInt(x, 16);\r\n        return x;\r\n    }\r\n\r\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\r\n        var server;\r\n        if (localTesting) {\r\n            console.log('local testing - sending to acceptance server the message ... ');\r\n            console.log(str);\r\n            server = '52.174.17.77';\r\n        } else {\r\n            server = '127.0.0.1';\r\n        }\r\n        var c = net.createConnection(5678, server);\r\n        c.on('error', function(error) {\r\n            c = net.createConnection(5678, server);\r\n        });\r\n        c.write(`${str}`);\r\n        c.end();\r\n    }\r\n    // modify to return the object that contains your data\r\n    return dataToReceiver;\r\n}\r\n// params is not defined locally -> export as module\r\nif (typeof(params) === 'undefined') {\r\n    module.exports = {\r\n        execute_ops\r\n    }\r\n} else { // on server use local defined vars\r\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\r\n    // define global returns\r\n    msg = return_values;\r\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, configIds.SpeedDialSettings.EnableDisableSpeedDial);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734423608},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, '1');\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                                    //configIds.SpeedDialSettings.EnableDisableSpeedDial\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734424064},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var enablePhone = hex2bin(value.substring(0, 1)).substring(0, 1);\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enablePhone);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                                    //configIds.SpeedDialSettings.EnableDisableSpeedDial\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734461682},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734462462},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, ';\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, ';\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734463709},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, ';\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enableDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734463932},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 3));\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734520814},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734521810},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            //if (beaconStatus.substring(4, 5) == '1') {\\r\\n                            //    homeBeacon += ' Enable, '\\r\\n                            //} else {\\r\\n                            //    homeBeacon += ' Disable, '\\r\\n                            //};\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if (wifiStatus == '8') {\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1734522292},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data to kibana\\r\\n    sendDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    /*var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);*/\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function sendDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        console.log(dataToReceiver);\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                sendDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742549373},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data to kibana\\r\\n    sendDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    /*var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);*/\\r\\n    //}\\r\\n    //return {\\r\\n    //    'output': dataToReceiver\\r\\n    //}\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    function sendDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        console.log(dataToReceiver);\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                sendDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                return\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                //  CareWatch-CYC;<<imei>>;STATUS=<<status_data>>;TIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;GENERAL=<<general>>;\\r\\n                // \\\"CareWatch-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(str) { // write debug info to console log, if localTesting\\r\\n        if (localTesting === \\\"True\\\") {\\r\\n            console.log(str);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742550263},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                console.log(data);\\r\\n                                return data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\r\\n            .reverse() // invierte el orden\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        const port = 5878; //Protocol-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742635144},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                console.log(data);\\r\\n                                return data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            // event_time = timestamp; \\r\\n                            event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\r\\n            .reverse() // invierte el orden\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        const port = localTesting ? '5878' : ''; //Protocol-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742645392},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                console.log(data);\\r\\n                                return data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            //event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\r\\n            .reverse() // invierte el orden\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\r\\n        const port = '5878'; //Protocol-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742648212},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Joe Bloggs\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 12/04/2024\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                console.log(data);\\r\\n                                return data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            //event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\r\\n            .reverse() // invierte el orden\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to protocol-dev server the message ... '); // port 5878\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5878, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5878, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    /*\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\r\\n        const port = '5878';  //Protocol-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    } \\r\\n    */\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742648816},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 22/03/2025\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                console.log(data);\\r\\n                                return data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            //event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\r\\n            .reverse() // invierte el orden\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n    /*\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5878, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5878, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }*/\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\r\\n        const port = '5678'; //acceptance-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }*/\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742649832},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 22/03/2025\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // send error msg to kibana\\r\\n                                const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                console.log(data);\\r\\n                                return data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            //event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\r\\n            .reverse() // invierte el orden\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n    /*\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5878, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5878, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }*/\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\r\\n        const port = '5678'; //acceptance-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742649962},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n    ///////////////////////////////////////////////////////////////////////////////\\n    //\\n    // Roam protocol - please see variables and typical values in order below\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n    //\\n    // Author: Juanmi Navarro\\n    // Created: 01/01/0000\\n    // Last modified: 22/03/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        let localTesting = \\\"False\\\";\\n    }\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n    ];\\n    var codeValues = [];\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\n    var dataToReceiver = [];\\n    var configsToAck = [];\\n    var configsToUpdate = [];\\n    var configsToSend = [];\\n    if (globalTemplate == \\\"True\\\") {\\n        if (raw.startsWith('esendex')) {\\n            AddValue(codeValues, 'rawMsg', raw);\\n            //general SMS message\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\n            return;\\n        }\\n        AddValue(codeValues, 'raw', raw);\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\n        var homeBeacon = '';\\n        var homeWiFi = '';\\n        var contacts = '';\\n        var gps_data = '';\\n        var wifi_data = '';\\n        var status_data = '';\\n        var lbs_data = '';\\n        var beacon_data = '';\\n        var ble_data = '';\\n        var smart_data = '';\\n        //parse header & properties\\n        var message = rawFromBytes;\\n        var properties = message.substring(2, 4);\\n        var lengthLittleEndian = message.substring(4, 8);\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\n        var messageForReceiver;\\n        var sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        var index = 18;\\n        var prefix = 'AB' + '00';\\n        var lengthAck = 0;\\n        var ack = '';\\n        var needsAck = false;\\n        var hasConfigs = false;\\n        var general = '';\\n        var timestamp = '';\\n        var info = '';\\n        var customID = '';\\n        latitude = 0;\\n        longitude = 0;\\n        location_accuracy = 0; // GPS location adds the accuracy\\n        location_time = event_time = '';\\n        speed = 0.0;\\n        var location_type = '0';\\n        //var gen_location = '0'; \\n        var i; // general loop counter\\n        var battery_percentage = '';\\n        var cellNetworkSignal = '';\\n        var workMode = '';\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\n            needsAck = true;\\n        }\\n        // Loop to decode multi-ACK msg\\n        if (message.includes('AB00030008C7')) {\\n            const multiack = message.split('AB00');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB00' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            } // FOR multiACK\\n        } else decoder(message); // IF multiACK\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\n        AddValue(codeValues, 'rawMsg', raw);\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\n            var gen_location = params.gps_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var location_accuracy = gen_location[2];\\n            var speed = gen_location[3];\\n            var direction = gen_location[4];\\n            var altitude = gen_location[5];\\n            var satellites = gen_location[6];\\n            var mileage = gen_location[7];\\n            if (location_accuracy !== 0) {\\n                var fix_state = 1;\\n            } else {\\n                var fix_state = 0;\\n            }\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            AddValue(codeValues, 'speed', speed);\\n            AddValue(codeValues, 'direction', direction);\\n            AddValue(codeValues, 'altitude', altitude);\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\n            AddValue(codeValues, 'mileage', mileage);\\n            AddValue(codeValues, 'satellites', satellites);\\n            AddValue(codeValues, 'fix_state', fix_state);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\n            var variables = []; //Define array\\n            variables = params.lbs_data.split(',');\\n            var index = 2;\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\n                    AddValue(codeValues, 'mcc', variables[0]);\\n                    AddValue(codeValues, 'mnc', variables[1]);\\n                    AddValue(codeValues, 'lac', variables[index]);\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\n                }\\n                index += 3;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\n            var bssid_array = params.wifi_data.split(',');\\n            var index = 0;\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\n                }\\n                index += 2;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        //  when Beacon is detected and it isn't flic BLE detected\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\n            var gen_location = params.beacon_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var mac = gen_location[2];\\n            var label = gen_location[3];\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac) {\\n                AddValue(codeValues, 'beacon_mac', mac);\\n                var simpleQuery = [{\\n                    'code': 'Mac',\\n                    'value': mac,\\n                }];\\n                var simpleQueryLabel = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery\\n                };\\n                var labels = [];\\n                labels.push(JSON.stringify(simpleQueryLabel));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\n            var gen_location = params.ble_data.split(',');\\n            var flag = gen_location[0];\\n            var batLevel = gen_location[1];\\n            var mac2 = gen_location[2];\\n            //var label = gen_location[3];\\n            AddValue(codeValues, 'flagBLE', flag);\\n            AddValue(codeValues, 'batBLE', batLevel);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac2) {\\n                AddValue(codeValues, 'beacon_mac', mac2);\\n                var simpleQuery2 = [{\\n                    'code': 'Mac',\\n                    'value': mac2,\\n                }];\\n                var simpleQueryLabel2 = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery2\\n                };\\n                var labels2 = [];\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        /*  meter mas tarde...   \\n            if (params.smart_data !== 'undefined') {\\n                var gen_location = params.smart_data.split(',')\\n                var latitude = gen_location[0]\\n                var longitude = gen_location[1]\\n                var location_accuracy = gen_location[2]\\n                var altitude = gen_location[3]\\n                AddValue(codeValues,'latitude', latitude);\\n                AddValue(codeValues,'longitude', longitude);\\n                AddValue(codeValues,'altitude', altitude);\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\n            }\\n          */\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues,'event_time', event_time);\\n        }  revisar mas adelante*/\\n        // to parse SMS info from the device\\n        switch (messageTypeLocalCode) {\\n            case 'COMM-SMS': // SMS message sent in\\n                if (params.data.startsWith('Device location request')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('IMEI:')) {\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n                } else if (params.data.startsWith('flush ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('Set Roam-')) {\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\n                } else if (params.data.startsWith('set live tracking')) {\\n                    configsToAck.push(configIds.Controls.Trace);\\n                } else if (params.data.startsWith('reboot ok')) {\\n                    configsToAck.push(configIds.Controls.Reboot);\\n                } else if (params.data.startsWith('GPS')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                    var i1 = params.data.search('Now:')\\n                    var i2 = params.data.search('Loc Time:')\\n                    var i3 = params.data.search('Speed:')\\n                    var i4 = params.data.search('Altitude:')\\n                    var i5 = params.data.search('Battery:')\\n                    var i6 = params.data.search('google')\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                        Speed = Speed * 0.44704\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                        Speed = Speed / 3.6\\n                    }\\n                    var latlong = params.data.substring(i6 + 18)\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                break;\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\n                //var i1 = params.data.search('IMEI:')\\n                //var i2 = params.data.search('GSM signal quality:')\\n                var i3 = params.data.search('Software version:')\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\n                var i4 = sub.search('version:');\\n                var fwVersion = sub.substring(i4, sub.length);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                break;\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\n                var i1 = params.data.search('Fall alarm:');\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\n                var i2 = params.data.search('level:');\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\n                break;\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\n                var i1 = raw.search('1,');\\n                //var i2 = params.data.search('2,');\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                break;\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = raw.search('A1:');\\n                if (raw.includes('A2:')) {\\n                    var i2 = raw.search('A2:');\\n                } else {\\n                    var i2 = raw.search('A10:');\\n                }\\n                var tel = raw.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                i2 = raw.search('A10:')\\n                tel = raw.substring(i2 + 4, raw.length);\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                break;\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = params.data.search('APN:')\\n                var i2 = params.data.search('IP:')\\n                var i3 = params.data.search('Move')\\n                var apn = params.data.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"apn\\\", apn);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\n                var i3 = params.data.search('Speed:')\\n                var i4 = params.data.search('Altitude:')\\n                var i5 = params.data.search('Battery:')\\n                var i6 = params.data.search('google')\\n                var eventTime = params.data.substring(0, i3)\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                    Speed = Speed * 0.44704\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                    Speed = Speed / 3.6\\n                }\\n                var latlong = params.data.substring(i6 + 18)\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n        }\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues, 'event_time', event_time);\\n        }\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n        //    var location_time = moment.utc().unix();\\n        //    AddValue(codeValues, 'location_time', location_time);\\n        //}\\n    }\\n    // send data msg to kibana\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n    console.log(data);\\n    return data\\n    // end of main operation\\n    // define functions used in operation\\n    // decode global msg\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\n        var checksum = message.substring(8, 12);\\n        var messageBody = message.substring(16, message.length);\\n        debug('message =' + message);\\n        debug('checksum =' + checksum);\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n            debug(\\\"message has valid checksum\\\");\\n            var messageBody = command; // update value for the ACK\\n            debug('command =' + command);\\n            if (command == '01') {\\n                while (index < total_length + 16) {\\n                    // gen_location = '0'; //cambiado 30/09\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        //Device ID\\n                        case '01':\\n                            var imei = hexToAscii(value);\\n                            break;\\n                            //Alarm code\\n                        case '02':\\n                            var alarm = 'CYC';\\n                            var alarmCode = value.substring(0, 8);\\n                            alarmCode = changeEndianness(alarmCode);\\n                            var timestampHex = value.substring(8, 16);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            event_time = timestamp;\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\n                            var alarmCodeExt = value.substring(16, 24);\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n                            //Extended Alerts\\n                            // Fall off\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Standard Alerts\\n                            //Battery low\\n                            else if ((alarmCodeInt & 1) == 1) {\\n                                var alarm = 'BATL';\\n                            }\\n                            //Overspeed\\n                            else if ((alarmCodeInt & 2) == 2) {\\n                                var alarm = 'ALSP';\\n                            }\\n                            //Fall\\n                            else if ((alarmCodeInt & 4) == 4) {\\n                                var alarm = 'ALF';\\n                            }\\n                            //Tilt\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'Tilt';\\n                            } else if ((alarmCodeInt & 16) == 16) {\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\n                                    var alarm = 'Geo1-IN';\\n                                } else {\\n                                    var alarm = 'Geo1-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 32) == 32) {\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\n                                    var alarm = 'Geo2-IN';\\n                                } else {\\n                                    var alarm = 'Geo2-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 64) == 64) {\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\n                                    var alarm = 'Geo3-IN';\\n                                } else {\\n                                    var alarm = 'Geo3-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 128) == 128) {\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\n                                    var alarm = 'Geo4-IN';\\n                                } else {\\n                                    var alarm = 'Geo4-OUT';\\n                                }\\n                            }\\n                            //Power Off\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\n                                var alarm = 'Side2';\\n                            }\\n                            //Battery charging\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\n                                var alarm = 'BATCN';\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                            }\\n                            //SOS Ending\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'SOSEnding';\\n                                info = 'Alarm Finished';\\n                            }\\n                            //Amber Alert  EC03 only\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALAO';\\n                            }\\n                            // welfare Alert check-in ALA-O\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'ALA-O';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\n                            //    var alarm = 'ALA-C';\\n                            //}\\n                            // Fall-Down Alert ending\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // welfare Alert Ending  ALA\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\n                            //    var alarm = 'BEA';\\n                            //}\\n                            general += 'alarm:' + alarm + ',';\\n                            break;\\n                            //Custom ID\\n                        case '03':\\n                            // in value is customID.... '06' for Watch Care\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //update customID to check if belongs to this type of device\\n                            customID = value;\\n                            if (value != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                // exit decoder\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n                                // console.log(data);\\n                                return // data\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                }\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                general += 'customID:' + value + ',';\\n                                break;\\n                            }\\n                            //Historical Data Completed\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\n                            var histData = true;\\n                            break;\\n                            //GPS location\\n                        case '20':\\n                            location_type = 'GPS';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var speedHex = value.substring(16, 20);\\n                            var directionHex = value.substring(20, 24);\\n                            var altitudeHex = value.substring(24, 28);\\n                            var location_accuracyHex = value.substring(28, 32);\\n                            var mileageHex = value.substring(32, 40);\\n                            var satellitesHex = value.substring(40, 42);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            // Range: 0.5 to 99.9  \\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n                            var satellites = hexToDecimal(satellitesHex);\\n                            // location_time = timestamp;\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //WIFI Towers\\n                        case '22':\\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            wifi_data = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            wifi_data = wifi_data.slice(0, -1);\\n                            general += wifi_data;\\n                            break;\\n                            //BLE Location  Added 10/10/22\\n                        case '23':\\n                            location_type = 'BLE';\\n                            var mac = value.substring(0, 12);\\n                            var latitudeHex = value.substring(12, 20);\\n                            var longitudeHex = value.substring(20, 28);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var address = hexToAscii(value.substring(28, value.length));\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            // location_time = timestamp;\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //General Data ,  status_data\\n                        case '24':\\n                            //var general = 'true'\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            }\\n                            //else {\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n                            //}\\n                            // reset variables\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            var timestampHex = value.substring(0, 8);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            location_time = timestamp;\\n                            event_time = timestamp;\\n                            // HardCode to fix possible issue in protocol\\n                            //event_time = moment.utc().unix();\\n                            // end of hard code\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\n                            var statusInt = hexToDecimal(statusHex);\\n                            var statusDevice = '';\\n                            if ((statusInt & 1) == 1) {\\n                                statusDevice += 'GPS,';\\n                            }\\n                            if ((statusInt & 2) == 2) {\\n                                statusDevice += 'WIFISource,';\\n                            }\\n                            if ((statusInt & 4) == 4) {\\n                                statusDevice += 'CellTower,';\\n                            }\\n                            if ((statusInt & 8) == 8) {\\n                                statusDevice += 'BLELocation,';\\n                            }\\n                            //params.BatteryStatus.BatteryStatus = '1';\\n                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // var alarm = 'BATCN';\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '1';\\n                                     var alarm = 'BATCN';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            if ((statusInt & 32) == 32) {\\n                                statusDevice += 'FUllyCharged,';\\n                                //var alarm = 'BATF';\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '3';\\n                                     var alarm = 'BATF';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n                                 statusDevice += 'Not Charging,';\\n                                 var alarm = 'BATCF';\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\n                                       var batteryStatus = '2';\\n                                       var alarm = 'BATCF';\\n                                       let configsToUpdate = [];\\n                                       configsToUpdate.push({\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\n                                           'value': batteryStatus\\n                                       });\\n                                   }\\n                             }*/\\n                            if ((statusInt & 64) == 64) {\\n                                statusDevice += 'Reboot,';\\n                            }\\n                            if ((statusInt & 128) == 128) {\\n                                statusDevice += 'HistoricalData,';\\n                            }\\n                            if ((statusInt & 256) == 256) {\\n                                statusDevice += 'AGPSDataValid,';\\n                            }\\n                            if ((statusInt & 512) == 512) {\\n                                statusDevice += 'Motion,';\\n                            }\\n                            if ((statusInt & 1024) == 1024) {\\n                                statusDevice += 'SmartLocating,';\\n                            }\\n                            if ((statusInt & 2048) == 2048) { //isHome\\n                                statusDevice += 'BeaconLocation,';\\n                            }\\n                            if ((statusInt & 4096) == 4096) {\\n                                statusDevice += 'BLEConnected,';\\n                            }\\n                            if ((statusInt & 16384) == 16384) {\\n                                statusDevice += 'HomeWiFi,';\\n                            }\\n                            statusDevice = statusDevice.slice(0, -1);\\n                            status_data = statusDevice; //to oysta template\\n                            //statusHex = (statusHex);\\n                            statusHex = hexToBin(statusHex);\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\n                            general += 'statusDevice:' + statusDevice + ',';\\n                            if (battery_percentage) {\\n                                general += 'battery:' + battery_percentage + ',';\\n                            }\\n                            if (cellNetworkSignal) {\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n                            }\\n                            if (workMode) {\\n                                general += 'workMode:' + workMode + ',';\\n                            }\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n                            break;\\n                            //Call Records\\n                        case '25':\\n                            //Needed?\\n                            break;\\n                            //BLE Location 2\\n                        case '26':\\n                            //I don't understand\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Smart Location\\n                        case '27':\\n                            location_type = 'SMART';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var location_accuracyHex = value.substring(16, 20);\\n                            var altitudeHex = value.substring(20, 24);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //location_time = timestamp;\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //Beacon Location  Added 11/10/22\\n                        case '28':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                                descr = hexToAscii(value.substring(34, value.length));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            // var latitudeHex = value.substring(18, 26);\\n                            // var longitudeHex = value.substring(26, 34);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            // Beacon V2\\n                        case '2C':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(20, 28);\\n                                longitudeHex = value.substring(28, 36);\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            //Cell Towers Note\\n                        case '29':\\n                            location_type = 'LBS';\\n                            lbs_data = '';\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\n                            var mncHex = value.substring(4, 6);\\n                            var mcc = hexToDecimal(mccHex);\\n                            lbs_data += mcc + ',';\\n                            var mnc = hexToDecimal(mncHex);\\n                            lbs_data += mnc + ',';\\n                            var indexLbs = 6;\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n                            for (let i = 0; i < numTowers; i++) {\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n                                var rxl = hexToDecimal(rxlHex);\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n                                var lac = hexToDecimal(lacHex);\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n                                indexLbs += 14;\\n                            }\\n                            lbs_data = lbs_data.slice(0, -1);\\n                            general += lbs_data;\\n                            break;\\n                        case '30':\\n                            //G-sensor. \\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numStep = (keyLength - 2) / 16;\\n                            for (let j = 0; j < numStep; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var stepHex = value.substring(8, 16);\\n                                stepHex = changeEndianness(stepHex);\\n                                var stepRate = hexToDecimal(stepHex);\\n                                info = stepRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'STP';\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //Activity\\n                        case '31':\\n                            //I don't understand\\n                            break;\\n                            //BLE MAC list\\n                        case '32':\\n                            //I don't understand\\n                            break;\\n                            //Beacon List\\n                        case '33':\\n                            //I don't understand\\n                            break;\\n                            //Heart Rate Data\\n                        case '40':\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numHeartRate = (keyLength - 2) / 12;\\n                            for (let j = 0; j < numHeartRate; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var heartRateHex = value.substring(8, 10);\\n                                var heartRate = hexToDecimal(heartRateHex);\\n                                var trustLevelHex = value.substring(10, 12);\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\n                                info = heartRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'HRT';\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //BLE Connected  . For Flic button\\n                        case '62':\\n                            location_type = 'BLE';\\n                            //var alarm = 'EBZI'; \\n                            //var latitudeHex = '00';\\n                            //var longitudeHex = '00';\\n                            //var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n                            //location_time = timestamp;\\n                            ble_data = `${flag},${batLevel},${mac}`;\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n                            break;\\n                    }\\n                }\\n                if (alarmCode) {\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                } else if (statusDevice) {\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                /*else if (alarm === 'HRT') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else if (alarm === 'STP') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else {\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           }*/\\n                // rest the alarm value\\n                alarm = '';\\n            }\\n            if (command == '02') {\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    switch (key) {\\n                        //Module Number\\n                        case '01':\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Firmware version\\n                        case '02':\\n                            //no ACK need\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1A':\\n                            //no ACK need\\n                            var fwVersion = hexToAscii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            break;\\n                            //IMEI\\n                        case '03':\\n                            var imei = hexToDecimal(value);\\n                            // harcode to avoid conflicts with Rio protocol\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\n                            //    return\\n                            //}\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                            }\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //ICCID\\n                        case '04':\\n                            var iccid = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //BLE-MAC\\n                        case '05':\\n                            var bleMac = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Run Time\\n                        case '07':\\n                            var runTime = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '10': // Ringer Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\n                            break;\\n                        case '0A': //Performance  mode\\n                            //var workMode = hexToDecimal(value);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            break;\\n                        case '1B':\\n                            //Decimal o ascii?\\n                            var gsmModule = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1F':\\n                            //System Language\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n                            break;\\n                        case '33': // phone option\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n                                var auto = 'true';\\n                            } else var auto = 'false';\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                allow = 'true';\\n                            } else var allow = 'false';\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            break;\\n                        case '30': //ContactList\\n                            var contactNumber = value.substring(1, 2);\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\n                            var tel = '';\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                case '0':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n                                    break;\\n                                    // Gateway Number\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n                                        tel = 'Esendex UK'\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n                                        tel = 'Esendex Spain'\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n                                        tel = 'Esendex UK Acceptance'\\n                                    } else {\\n                                        tel = 'Default'\\n                                    }\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                                    break;\\n                                default:\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) {\\n                                        contacts += '';\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                        break;\\n                                    }\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n                                    contacts += tel + ', ';\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                    break;\\n                            }\\n                            break;\\n                        case '40': // APN\\n                            //no ACK need\\n                            var apn = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                            break;\\n                        case '43': //Server Details\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\n                                serverDetails = 'Production'\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\n                                serverDetails = 'Acceptance'\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\n                                serverDetails = 'Protocol-Import'\\n                            } else {\\n                                serverDetails = 'Default'\\n                            }\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                            break;\\n                        case '44': //time interval - work mode intervals\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            var workMode = 0;\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\n                                //workMode = 'High Frequency';\\n                                workMode = 3;\\n                            }\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\n                                //workMode = 'Balanced';\\n                                workMode = 2;\\n                            }\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\n                                //workMode = 'Power Saving';\\n                                workMode = 1;\\n                            }\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\n                                //workMode = 'No Reporting';\\n                                workMode = 0;\\n                            }\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '47': // Custom Id\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\n                            configsToAck.push(configIds.ReadState.CustomId);\\n                            break;\\n                        case '53': // Non motion alert\\n                            //2B020080\\n                            var status = hexToBin(value.substring(6, 8));\\n                            var alertSetting = '';\\n                            var enableDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enableDisable = '1';\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                            };\\n                            //if (status.substring(5, 6) == '1') {\\n                            //    alertSetting += 'Dial, '\\n                            //} else {\\n                            //    alertSetting += 'No Dial, '\\n                            //};\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\n                            var enalbleDisable = '';\\n                            //if (fallStatus.substring(4, 5) == '1') {\\n                            if (fallStatus.substring(0, 1) == '1') {\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                var sensibility = 'Disable, '\\n                            };\\n                            if (fallStatus.substring(5, 6) == '1') {\\n                                sensibility += 'Dial, '\\n                            } else {\\n                                sensibility += 'No Dial, '\\n                            };\\n                            var imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n                            sensibility += sesibityOptionValue;\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n                            homeBeacon += beaconStatus + ', ';\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '4A': //Wifi Network List\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n                            var wifiStatus = value.substring(0, 1);\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n                            /var homeWifi = '';\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\n                                if (wifiStatus == '8') {\\n                                    homeWifi += ' Enable, '\\n                                    enalbleDisable = '1';\\n                                } else {\\n                                    homeWifi += ' Disable, '\\n                                    //enalbleDisable = '0';\\n                                };*/\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                            }\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n                            break;\\n                        case '21': // Speed Dial Settings\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '03') {\\n                while (index < total_length + 16) {\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        case '01': // Device ID\\n                            var imei = hexToAscii(value);\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                            }\\n                            break;\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /* case '03':\\n                                //update customID to check if belongs to this type of device\\n                                customID = value;\\n                                if (value != '04') {\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    return\\n                                } else {\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    }\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    general += 'customID:' + value + ',';\\n                                    break;\\n                                }\\n                                break; */\\n                        case '10': // Heartbeat\\n                            var heartbeat = hexToAscii(value);\\n                            event_time = moment.utc().unix();\\n                            if (index < total_length + 16) {\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\n                                key = message.substring(index, index = index + 2);\\n                                if (key == '24') {\\n                                    //     debug('key: ' + key) //comment those out\\n                                    value = message.substring(index, index = index + keyLength - 2);\\n                                    //    debug(value)\\n                                    var timestampHex = value.substring(0, 8);\\n                                    //    debug('timestampt hex: ' + timestampHex)\\n                                    timestampHex = changeEndianness(timestampHex);\\n                                    timestamp = hexToDecimal(timestampHex);\\n                                    event_time = timestamp;\\n                                    //    debug(event_time)\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\n                                    //    debug(statusHex)\\n                                    var statusInt = hexToDecimal(statusHex);\\n                                    var statusDevice = '';\\n                                    if ((statusInt & 1) == 1) {\\n                                        statusDevice += 'GPS,';\\n                                    }\\n                                    if ((statusInt & 2) == 2) {\\n                                        statusDevice += 'WIFISource,';\\n                                    }\\n                                    if ((statusInt & 4) == 4) {\\n                                        statusDevice += 'CellTower,';\\n                                    }\\n                                    if ((statusInt & 8) == 8) {\\n                                        statusDevice += 'BLELocation,';\\n                                    }\\n                                    if ((statusInt & 16) == 16) {\\n                                        statusDevice += 'Charging,';\\n                                    }\\n                                    if ((statusInt & 32) == 32) {\\n                                        statusDevice += 'FUllyCharged,';\\n                                    }\\n                                    if ((statusInt & 64) == 64) {\\n                                        statusDevice += 'Reboot,';\\n                                    }\\n                                    if ((statusInt & 128) == 128) {\\n                                        statusDevice += 'HistoricalData,';\\n                                    }\\n                                    if ((statusInt & 256) == 256) {\\n                                        statusDevice += 'AGPSDataValid,';\\n                                    }\\n                                    if ((statusInt & 512) == 512) {\\n                                        statusDevice += 'Motion,';\\n                                    }\\n                                    if ((statusInt & 1024) == 1024) {\\n                                        statusDevice += 'SmartLocating,';\\n                                    }\\n                                    if ((statusInt & 2048) == 2048) {\\n                                        statusDevice += 'BeaconLocation,';\\n                                    }\\n                                    if ((statusInt & 4096) == 4096) {\\n                                        statusDevice += 'BLEConnected,';\\n                                    }\\n                                    statusDevice = statusDevice.slice(0, -1);\\n                                    //   debug('statusHex:' + statusHex)\\n                                    statusHex = (statusHex);\\n                                    statusHex = hexToBin(statusHex);\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                                    //    debug(statusHex)\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                                    //    debug(battery_percentage)\\n                                    //    debug(battery_percentage)\\n                                    //    debug(statusHex.substring(8, 13))\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                                    //    debug(cellNetworkSignal)\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\n                                    //    debug(workMode)\\n                                    general += 'statusDevice:' + statusDevice + ';';\\n                                    if (battery_percentage) {\\n                                        general += 'battery:' + battery_percentage + ';';\\n                                    }\\n                                    if (cellNetworkSignal) {\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n                                    }\\n                                    if (workMode) {\\n                                        general += 'workMode:' + workMode + ';';\\n                                    }\\n                                }\\n                            }\\n                            // revisar\\n                            var gen_location = '0';\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '12': // Device requesting timestamp\\n                            timestamp = moment.utc().unix();\\n                            timestampHex = decimalToHex(timestamp);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n                            // respond to device with the timestamp of the server\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '21': //Cell Towers\\n                            var mccHex = value.substring(0, 2);\\n                            var mncHex = value.substring(2, 3);\\n                            var mcc = hexToDecimal(mccHex);\\n                            var mnc = hexToDecimal(mncHex);\\n                            var numTowers = (keyLength - 4) / 5;\\n                            var cellTowers = hexToAscii(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '22': // WIFI locations \\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            gen_location = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            gen_location = gen_location.slice(0, -1);\\n                            general += gen_location;\\n                            //CustomID is not provided so far with command type 03\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            alarmCode = '';\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '04') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7E') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7F') {\\n                // while (index < total_length + 16) {\\n                var keyLength = message.substring(index, index = index + 2);\\n                keyLength = 2 * hexToDecimal(keyLength);\\n                var key = message.substring(index, index = index + 2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                var value = message.substring(index, index = index + keyLength - 2);\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n                //}\\n            }\\n            if (command == 'FE') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            // prepare the ACK msg and change config if it is needed\\n            lengthAck = messageBody.length / 2;\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n            ////////////checksum CRC 16\\n            var checksumAck = byteStringToByteArray(messageBody);\\n            checksumAck = crc16byte(checksumAck);\\n            checksumAck = decimalToHex(checksumAck);\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\n            // To send ACK to the device previous to internal msg with parts\\n            if (needsAck == true) {\\n                if (messageBody.length <= 2) {\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n                } else {\\n                    ack = prefix + messageBody;\\n                }\\n                AddValue(codeValues, 'imei', imei);\\n                AddValue(codeValues, 'ack', ack);\\n            }\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n            if (i >= 0) {\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n    // Auxiliary functions\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n        const dataToReceiver = {\\n            values: codeValues\\n        };\\n        if (configsToAck.length > 0) {\\n            dataToReceiver.configsToAck = configsToAck;\\n        }\\n        if (configsToUpdate.length > 0) {\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\n        }\\n        if (configsToSend.length > 0) {\\n            dataToReceiver.configsToSend = configsToSend;\\n        }\\n        return dataToReceiver;\\n    }\\n\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        var cvpair = {\\n            code: p1,\\n            value: p2\\n        };\\n        codeValueArray.push(cvpair);\\n    }\\n    // convert functions\\n    function asciiToHex(str) { // ascii to hex \\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n    }\\n\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n        const bytes = [];\\n        for (let i = 0; i < str.length; i += 2) {\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n                bytes.push(byte);\\n            }\\n        }\\n        return bytes;\\n    }\\n\\n    function decimalToHex(x) {\\n        return Number(x).toString(16).toUpperCase();\\n    }\\n\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n        const bin = parseInt(hex, 16).toString(2);\\n        return bin.padStart(hex.length * 4, '0');\\n    }\\n\\n    function hexToAscii(hex) {\\n        if (hex.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 !== 0) {\\n            hex = '0' + hex;\\n        }\\n        const num = parseInt(hex, 16);\\n        const bits = hex.length * 4;\\n        const maxVal = 2 ** bits;\\n        return num >= maxVal / 2 ? num - maxVal : num;\\n    }\\n\\n    function hexToDecimal(hex) {\\n        return parseInt(hex, 16);\\n    }\\n    // CheckSum and debug functions\\n    function changeEndianness(hexString) { // changeEndianness\\n        if (hexString.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\n            .reverse() // invierte el orden\\n            .join('');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n        const bytes = byteStringToByteArray(payloadData);\\n        const crc = crc16byte(bytes);\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n        return changeEndianness(hex);\\n    }\\n\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n        let crc = 0x0000;\\n        for (const byte of byteArray) {\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\n            }\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\n            crc = crcTable[index] ^ (crc << 8);\\n        }\\n        return crc & 0xFFFF;\\n    }\\n\\n    function debug(...args) { // write debug info to console log, if localTesting\\n        if (localTesting) {\\n            console.debug('[DEBUG]', ...args);\\n        }\\n    }\\n    /*\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n        var server;\\n        if (localTesting) {\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5878, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5878, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }*/\\n    function sendMessageToLocalhostNoWait(message) {\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\n        const port = '5678'; //acceptance-dev\\n        if (localTesting) {\\n            console.debug('[DEBUG] Sending message to test server:', message);\\n        }\\n        const client = net.createConnection(port, server, () => {\\n            client.write(message);\\n            client.end();\\n        });\\n        client.on('error', (err) => {\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n        });\\n        client.on('end', () => {\\n            if (localTesting) {\\n                console.debug('[DEBUG] Connection closed');\\n            }\\n        });\\n    }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n    module.exports = {\\n        execute_ops\\n    }\\n} else { // on server use local defined vars\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n    // define global returns\\n    msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744112746},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n    ///////////////////////////////////////////////////////////////////////////////\\n    //\\n    // Roam protocol - please see variables and typical values in order below\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n    //\\n    // Author: Juanmi Navarro\\n    // Created: 01/01/0000\\n    // Last modified: 22/03/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        let localTesting = \\\"False\\\";\\n    }\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n    ];\\n    var codeValues = [];\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\n    var dataToReceiver = [];\\n    var configsToAck = [];\\n    var configsToUpdate = [];\\n    var configsToSend = [];\\n    if (globalTemplate == \\\"True\\\") {\\n        if (raw.startsWith('esendex')) {\\n            AddValue(codeValues, 'rawMsg', raw);\\n            //general SMS message\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\n            return;\\n        }\\n        AddValue(codeValues, 'raw', raw);\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\n        var homeBeacon = '';\\n        var homeWiFi = '';\\n        var contacts = '';\\n        var gps_data = '';\\n        var wifi_data = '';\\n        var status_data = '';\\n        var lbs_data = '';\\n        var beacon_data = '';\\n        var ble_data = '';\\n        var smart_data = '';\\n        //parse header & properties\\n        var message = rawFromBytes;\\n        var properties = message.substring(2, 4);\\n        var lengthLittleEndian = message.substring(4, 8);\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\n        var messageForReceiver;\\n        var sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        var index = 18;\\n        var prefix = 'AB' + '00';\\n        var lengthAck = 0;\\n        var ack = '';\\n        var needsAck = false;\\n        var hasConfigs = false;\\n        var general = '';\\n        var timestamp = '';\\n        var info = '';\\n        var customID = '';\\n        latitude = 0;\\n        longitude = 0;\\n        location_accuracy = 0; // GPS location adds the accuracy\\n        location_time = event_time = '';\\n        speed = 0.0;\\n        var location_type = '0';\\n        //var gen_location = '0'; \\n        var i; // general loop counter\\n        var battery_percentage = '';\\n        var cellNetworkSignal = '';\\n        var workMode = '';\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\n            needsAck = true;\\n        }\\n        // Loop to decode multi-ACK msg\\n        if (message.includes('AB00030008C7')) {\\n            const multiack = message.split('AB00');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB00' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            } // FOR multiACK\\n        } else decoder(message); // IF multiACK\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\n        AddValue(codeValues, 'rawMsg', raw);\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\n            var gen_location = params.gps_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var location_accuracy = gen_location[2];\\n            var speed = gen_location[3];\\n            var direction = gen_location[4];\\n            var altitude = gen_location[5];\\n            var satellites = gen_location[6];\\n            var mileage = gen_location[7];\\n            if (location_accuracy !== 0) {\\n                var fix_state = 1;\\n            } else {\\n                var fix_state = 0;\\n            }\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            AddValue(codeValues, 'speed', speed);\\n            AddValue(codeValues, 'direction', direction);\\n            AddValue(codeValues, 'altitude', altitude);\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\n            AddValue(codeValues, 'mileage', mileage);\\n            AddValue(codeValues, 'satellites', satellites);\\n            AddValue(codeValues, 'fix_state', fix_state);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\n            var variables = []; //Define array\\n            variables = params.lbs_data.split(',');\\n            var index = 2;\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\n                    AddValue(codeValues, 'mcc', variables[0]);\\n                    AddValue(codeValues, 'mnc', variables[1]);\\n                    AddValue(codeValues, 'lac', variables[index]);\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\n                }\\n                index += 3;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\n            var bssid_array = params.wifi_data.split(',');\\n            var index = 0;\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\n                }\\n                index += 2;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        //  when Beacon is detected and it isn't flic BLE detected\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\n            var gen_location = params.beacon_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var mac = gen_location[2];\\n            var label = gen_location[3];\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac) {\\n                AddValue(codeValues, 'beacon_mac', mac);\\n                var simpleQuery = [{\\n                    'code': 'Mac',\\n                    'value': mac,\\n                }];\\n                var simpleQueryLabel = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery\\n                };\\n                var labels = [];\\n                labels.push(JSON.stringify(simpleQueryLabel));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\n            var gen_location = params.ble_data.split(',');\\n            var flag = gen_location[0];\\n            var batLevel = gen_location[1];\\n            var mac2 = gen_location[2];\\n            //var label = gen_location[3];\\n            AddValue(codeValues, 'flagBLE', flag);\\n            AddValue(codeValues, 'batBLE', batLevel);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac2) {\\n                AddValue(codeValues, 'beacon_mac', mac2);\\n                var simpleQuery2 = [{\\n                    'code': 'Mac',\\n                    'value': mac2,\\n                }];\\n                var simpleQueryLabel2 = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery2\\n                };\\n                var labels2 = [];\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        /*  meter mas tarde...   \\n            if (params.smart_data !== 'undefined') {\\n                var gen_location = params.smart_data.split(',')\\n                var latitude = gen_location[0]\\n                var longitude = gen_location[1]\\n                var location_accuracy = gen_location[2]\\n                var altitude = gen_location[3]\\n                AddValue(codeValues,'latitude', latitude);\\n                AddValue(codeValues,'longitude', longitude);\\n                AddValue(codeValues,'altitude', altitude);\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\n            }\\n          */\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues,'event_time', event_time);\\n        }  revisar mas adelante*/\\n        // to parse SMS info from the device\\n        switch (messageTypeLocalCode) {\\n            case 'COMM-SMS': // SMS message sent in\\n                if (params.data.startsWith('Device location request')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('IMEI:')) {\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n                } else if (params.data.startsWith('flush ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('Set Roam-')) {\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\n                } else if (params.data.startsWith('set live tracking')) {\\n                    configsToAck.push(configIds.Controls.Trace);\\n                } else if (params.data.startsWith('reboot ok')) {\\n                    configsToAck.push(configIds.Controls.Reboot);\\n                } else if (params.data.startsWith('GPS')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                    var i1 = params.data.search('Now:')\\n                    var i2 = params.data.search('Loc Time:')\\n                    var i3 = params.data.search('Speed:')\\n                    var i4 = params.data.search('Altitude:')\\n                    var i5 = params.data.search('Battery:')\\n                    var i6 = params.data.search('google')\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                        Speed = Speed * 0.44704\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                        Speed = Speed / 3.6\\n                    }\\n                    var latlong = params.data.substring(i6 + 18)\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                break;\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\n                //var i1 = params.data.search('IMEI:')\\n                //var i2 = params.data.search('GSM signal quality:')\\n                var i3 = params.data.search('Software version:')\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\n                var i4 = sub.search('version:');\\n                var fwVersion = sub.substring(i4, sub.length);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                break;\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\n                var i1 = params.data.search('Fall alarm:');\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\n                var i2 = params.data.search('level:');\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\n                break;\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\n                var i1 = raw.search('1,');\\n                //var i2 = params.data.search('2,');\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                break;\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = raw.search('A1:');\\n                if (raw.includes('A2:')) {\\n                    var i2 = raw.search('A2:');\\n                } else {\\n                    var i2 = raw.search('A10:');\\n                }\\n                var tel = raw.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                i2 = raw.search('A10:')\\n                tel = raw.substring(i2 + 4, raw.length);\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                break;\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = params.data.search('APN:')\\n                var i2 = params.data.search('IP:')\\n                var i3 = params.data.search('Move')\\n                var apn = params.data.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"apn\\\", apn);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\n                var i3 = params.data.search('Speed:')\\n                var i4 = params.data.search('Altitude:')\\n                var i5 = params.data.search('Battery:')\\n                var i6 = params.data.search('google')\\n                var eventTime = params.data.substring(0, i3)\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                    Speed = Speed * 0.44704\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                    Speed = Speed / 3.6\\n                }\\n                var latlong = params.data.substring(i6 + 18)\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n        }\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues, 'event_time', event_time);\\n        }\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n        //    var location_time = moment.utc().unix();\\n        //    AddValue(codeValues, 'location_time', location_time);\\n        //}\\n    }\\n    // send data msg to kibana\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n    console.log(data);\\n    return data\\n    // end of main operation\\n    // define functions used in operation\\n    // decode global msg\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\n        var checksum = message.substring(8, 12);\\n        var messageBody = message.substring(16, message.length);\\n        debug('message =' + message);\\n        debug('checksum =' + checksum);\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n            debug(\\\"message has valid checksum\\\");\\n            var messageBody = command; // update value for the ACK\\n            debug('command =' + command);\\n            if (command == '01') {\\n                while (index < total_length + 16) {\\n                    // gen_location = '0'; //cambiado 30/09\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        //Device ID\\n                        case '01':\\n                            var imei = hexToAscii(value);\\n                            break;\\n                            //Alarm code\\n                        case '02':\\n                            var alarm = 'CYC';\\n                            var alarmCode = value.substring(0, 8);\\n                            alarmCode = changeEndianness(alarmCode);\\n                            var timestampHex = value.substring(8, 16);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            event_time = timestamp;\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\n                            var alarmCodeExt = value.substring(16, 24);\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n                            //Extended Alerts\\n                            // Fall off\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Standard Alerts\\n                            //Battery low\\n                            else if ((alarmCodeInt & 1) == 1) {\\n                                var alarm = 'BATL';\\n                            }\\n                            //Overspeed\\n                            else if ((alarmCodeInt & 2) == 2) {\\n                                var alarm = 'ALSP';\\n                            }\\n                            //Fall\\n                            else if ((alarmCodeInt & 4) == 4) {\\n                                var alarm = 'ALF';\\n                            }\\n                            //Tilt\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'Tilt';\\n                            } else if ((alarmCodeInt & 16) == 16) {\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\n                                    var alarm = 'Geo1-IN';\\n                                } else {\\n                                    var alarm = 'Geo1-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 32) == 32) {\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\n                                    var alarm = 'Geo2-IN';\\n                                } else {\\n                                    var alarm = 'Geo2-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 64) == 64) {\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\n                                    var alarm = 'Geo3-IN';\\n                                } else {\\n                                    var alarm = 'Geo3-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 128) == 128) {\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\n                                    var alarm = 'Geo4-IN';\\n                                } else {\\n                                    var alarm = 'Geo4-OUT';\\n                                }\\n                            }\\n                            //Power Off\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\n                                var alarm = 'Side2';\\n                            }\\n                            //Battery charging\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\n                                var alarm = 'BATCN';\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                            }\\n                            //SOS Ending\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'SOSEnding';\\n                                info = 'Alarm Finished';\\n                            }\\n                            //Amber Alert  EC03 only\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALAO';\\n                            }\\n                            // welfare Alert check-in ALA-O\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'ALA-O';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\n                            //    var alarm = 'ALA-C';\\n                            //}\\n                            // Fall-Down Alert ending\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // welfare Alert Ending  ALA\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\n                            //    var alarm = 'BEA';\\n                            //}\\n                            general += 'alarm:' + alarm + ',';\\n                            break;\\n                            //Custom ID\\n                        case '03':\\n                            // in value is customID.... '06' for Watch Care\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //update customID to check if belongs to this type of device\\n                            customID = value;\\n                            if (value != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                // exit decoder\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n                                // console.log(data);\\n                                return // data\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    return;\\n                                }\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                general += 'customID:' + value + ',';\\n                                break;\\n                            }\\n                            //Historical Data Completed\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\n                            var histData = true;\\n                            break;\\n                            //GPS location\\n                        case '20':\\n                            location_type = 'GPS';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var speedHex = value.substring(16, 20);\\n                            var directionHex = value.substring(20, 24);\\n                            var altitudeHex = value.substring(24, 28);\\n                            var location_accuracyHex = value.substring(28, 32);\\n                            var mileageHex = value.substring(32, 40);\\n                            var satellitesHex = value.substring(40, 42);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            // Range: 0.5 to 99.9  \\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n                            var satellites = hexToDecimal(satellitesHex);\\n                            // location_time = timestamp;\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //WIFI Towers\\n                        case '22':\\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            wifi_data = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            wifi_data = wifi_data.slice(0, -1);\\n                            general += wifi_data;\\n                            break;\\n                            //BLE Location  Added 10/10/22\\n                        case '23':\\n                            location_type = 'BLE';\\n                            var mac = value.substring(0, 12);\\n                            var latitudeHex = value.substring(12, 20);\\n                            var longitudeHex = value.substring(20, 28);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var address = hexToAscii(value.substring(28, value.length));\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            // location_time = timestamp;\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //General Data ,  status_data\\n                        case '24':\\n                            //var general = 'true'\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            }\\n                            //else {\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n                            //}\\n                            // reset variables\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            var timestampHex = value.substring(0, 8);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            location_time = timestamp;\\n                            event_time = timestamp;\\n                            // HardCode to fix possible issue in protocol\\n                            //event_time = moment.utc().unix();\\n                            // end of hard code\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\n                            var statusInt = hexToDecimal(statusHex);\\n                            var statusDevice = '';\\n                            if ((statusInt & 1) == 1) {\\n                                statusDevice += 'GPS,';\\n                            }\\n                            if ((statusInt & 2) == 2) {\\n                                statusDevice += 'WIFISource,';\\n                            }\\n                            if ((statusInt & 4) == 4) {\\n                                statusDevice += 'CellTower,';\\n                            }\\n                            if ((statusInt & 8) == 8) {\\n                                statusDevice += 'BLELocation,';\\n                            }\\n                            //params.BatteryStatus.BatteryStatus = '1';\\n                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // var alarm = 'BATCN';\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '1';\\n                                     var alarm = 'BATCN';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            if ((statusInt & 32) == 32) {\\n                                statusDevice += 'FUllyCharged,';\\n                                //var alarm = 'BATF';\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '3';\\n                                     var alarm = 'BATF';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n                                 statusDevice += 'Not Charging,';\\n                                 var alarm = 'BATCF';\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\n                                       var batteryStatus = '2';\\n                                       var alarm = 'BATCF';\\n                                       let configsToUpdate = [];\\n                                       configsToUpdate.push({\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\n                                           'value': batteryStatus\\n                                       });\\n                                   }\\n                             }*/\\n                            if ((statusInt & 64) == 64) {\\n                                statusDevice += 'Reboot,';\\n                            }\\n                            if ((statusInt & 128) == 128) {\\n                                statusDevice += 'HistoricalData,';\\n                            }\\n                            if ((statusInt & 256) == 256) {\\n                                statusDevice += 'AGPSDataValid,';\\n                            }\\n                            if ((statusInt & 512) == 512) {\\n                                statusDevice += 'Motion,';\\n                            }\\n                            if ((statusInt & 1024) == 1024) {\\n                                statusDevice += 'SmartLocating,';\\n                            }\\n                            if ((statusInt & 2048) == 2048) { //isHome\\n                                statusDevice += 'BeaconLocation,';\\n                            }\\n                            if ((statusInt & 4096) == 4096) {\\n                                statusDevice += 'BLEConnected,';\\n                            }\\n                            if ((statusInt & 16384) == 16384) {\\n                                statusDevice += 'HomeWiFi,';\\n                            }\\n                            statusDevice = statusDevice.slice(0, -1);\\n                            status_data = statusDevice; //to oysta template\\n                            //statusHex = (statusHex);\\n                            statusHex = hexToBin(statusHex);\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\n                            general += 'statusDevice:' + statusDevice + ',';\\n                            if (battery_percentage) {\\n                                general += 'battery:' + battery_percentage + ',';\\n                            }\\n                            if (cellNetworkSignal) {\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n                            }\\n                            if (workMode) {\\n                                general += 'workMode:' + workMode + ',';\\n                            }\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n                            break;\\n                            //Call Records\\n                        case '25':\\n                            //Needed?\\n                            break;\\n                            //BLE Location 2\\n                        case '26':\\n                            //I don't understand\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Smart Location\\n                        case '27':\\n                            location_type = 'SMART';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var location_accuracyHex = value.substring(16, 20);\\n                            var altitudeHex = value.substring(20, 24);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //location_time = timestamp;\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //Beacon Location  Added 11/10/22\\n                        case '28':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                                descr = hexToAscii(value.substring(34, value.length));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            // var latitudeHex = value.substring(18, 26);\\n                            // var longitudeHex = value.substring(26, 34);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            // Beacon V2\\n                        case '2C':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(20, 28);\\n                                longitudeHex = value.substring(28, 36);\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            //Cell Towers Note\\n                        case '29':\\n                            location_type = 'LBS';\\n                            lbs_data = '';\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\n                            var mncHex = value.substring(4, 6);\\n                            var mcc = hexToDecimal(mccHex);\\n                            lbs_data += mcc + ',';\\n                            var mnc = hexToDecimal(mncHex);\\n                            lbs_data += mnc + ',';\\n                            var indexLbs = 6;\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n                            for (let i = 0; i < numTowers; i++) {\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n                                var rxl = hexToDecimal(rxlHex);\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n                                var lac = hexToDecimal(lacHex);\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n                                indexLbs += 14;\\n                            }\\n                            lbs_data = lbs_data.slice(0, -1);\\n                            general += lbs_data;\\n                            break;\\n                        case '30':\\n                            //G-sensor. \\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numStep = (keyLength - 2) / 16;\\n                            for (let j = 0; j < numStep; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var stepHex = value.substring(8, 16);\\n                                stepHex = changeEndianness(stepHex);\\n                                var stepRate = hexToDecimal(stepHex);\\n                                info = stepRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'STP';\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //Activity\\n                        case '31':\\n                            //I don't understand\\n                            break;\\n                            //BLE MAC list\\n                        case '32':\\n                            //I don't understand\\n                            break;\\n                            //Beacon List\\n                        case '33':\\n                            //I don't understand\\n                            break;\\n                            //Heart Rate Data\\n                        case '40':\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numHeartRate = (keyLength - 2) / 12;\\n                            for (let j = 0; j < numHeartRate; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var heartRateHex = value.substring(8, 10);\\n                                var heartRate = hexToDecimal(heartRateHex);\\n                                var trustLevelHex = value.substring(10, 12);\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\n                                info = heartRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'HRT';\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //BLE Connected  . For Flic button\\n                        case '62':\\n                            location_type = 'BLE';\\n                            //var alarm = 'EBZI'; \\n                            //var latitudeHex = '00';\\n                            //var longitudeHex = '00';\\n                            //var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n                            //location_time = timestamp;\\n                            ble_data = `${flag},${batLevel},${mac}`;\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n                            break;\\n                    }\\n                }\\n                if (alarmCode) {\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                } else if (statusDevice) {\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                /*else if (alarm === 'HRT') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else if (alarm === 'STP') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else {\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           }*/\\n                // rest the alarm value\\n                alarm = '';\\n            }\\n            if (command == '02') {\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    switch (key) {\\n                        //Module Number\\n                        case '01':\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Firmware version\\n                        case '02':\\n                            //no ACK need\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1A':\\n                            //no ACK need\\n                            var fwVersion = hexToAscii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            break;\\n                            //IMEI\\n                        case '03':\\n                            var imei = hexToDecimal(value);\\n                            // harcode to avoid conflicts with Rio protocol\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\n                            //    return\\n                            //}\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                return;\\n                            }\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //ICCID\\n                        case '04':\\n                            var iccid = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //BLE-MAC\\n                        case '05':\\n                            var bleMac = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Run Time\\n                        case '07':\\n                            var runTime = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '10': // Ringer Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\n                            break;\\n                        case '0A': //Performance  mode\\n                            //var workMode = hexToDecimal(value);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            break;\\n                        case '1B':\\n                            //Decimal o ascii?\\n                            var gsmModule = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1F':\\n                            //System Language\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n                            break;\\n                        case '33': // phone option\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n                                var auto = 'true';\\n                            } else var auto = 'false';\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                allow = 'true';\\n                            } else var allow = 'false';\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            break;\\n                        case '30': //ContactList\\n                            var contactNumber = value.substring(1, 2);\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\n                            var tel = '';\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                case '0':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n                                    break;\\n                                    // Gateway Number\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n                                        tel = 'Esendex UK'\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n                                        tel = 'Esendex Spain'\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n                                        tel = 'Esendex UK Acceptance'\\n                                    } else {\\n                                        tel = 'Default'\\n                                    }\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                                    break;\\n                                default:\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) {\\n                                        contacts += '';\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                        break;\\n                                    }\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n                                    contacts += tel + ', ';\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                    break;\\n                            }\\n                            break;\\n                        case '40': // APN\\n                            //no ACK need\\n                            var apn = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                            break;\\n                        case '43': //Server Details\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\n                                serverDetails = 'Production'\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\n                                serverDetails = 'Acceptance'\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\n                                serverDetails = 'Protocol-Import'\\n                            } else {\\n                                serverDetails = 'Default'\\n                            }\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                            break;\\n                        case '44': //time interval - work mode intervals\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            var workMode = 0;\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\n                                //workMode = 'High Frequency';\\n                                workMode = 3;\\n                            }\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\n                                //workMode = 'Balanced';\\n                                workMode = 2;\\n                            }\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\n                                //workMode = 'Power Saving';\\n                                workMode = 1;\\n                            }\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\n                                //workMode = 'No Reporting';\\n                                workMode = 0;\\n                            }\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '47': // Custom Id\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\n                            configsToAck.push(configIds.ReadState.CustomId);\\n                            break;\\n                        case '53': // Non motion alert\\n                            //2B020080\\n                            var status = hexToBin(value.substring(6, 8));\\n                            var alertSetting = '';\\n                            var enableDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enableDisable = '1';\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                            };\\n                            //if (status.substring(5, 6) == '1') {\\n                            //    alertSetting += 'Dial, '\\n                            //} else {\\n                            //    alertSetting += 'No Dial, '\\n                            //};\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\n                            var enalbleDisable = '';\\n                            //if (fallStatus.substring(4, 5) == '1') {\\n                            if (fallStatus.substring(0, 1) == '1') {\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                var sensibility = 'Disable, '\\n                            };\\n                            if (fallStatus.substring(5, 6) == '1') {\\n                                sensibility += 'Dial, '\\n                            } else {\\n                                sensibility += 'No Dial, '\\n                            };\\n                            var imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n                            sensibility += sesibityOptionValue;\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n                            homeBeacon += beaconStatus + ', ';\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '4A': //Wifi Network List\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n                            var wifiStatus = value.substring(0, 1);\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n                            /var homeWifi = '';\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\n                                if (wifiStatus == '8') {\\n                                    homeWifi += ' Enable, '\\n                                    enalbleDisable = '1';\\n                                } else {\\n                                    homeWifi += ' Disable, '\\n                                    //enalbleDisable = '0';\\n                                };*/\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                            }\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n                            break;\\n                        case '21': // Speed Dial Settings\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '03') {\\n                while (index < total_length + 16) {\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        case '01': // Device ID\\n                            var imei = hexToAscii(value);\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                return;\\n                            }\\n                            break;\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /* case '03':\\n                                //update customID to check if belongs to this type of device\\n                                customID = value;\\n                                if (value != '04') {\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    return\\n                                } else {\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    }\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    general += 'customID:' + value + ',';\\n                                    break;\\n                                }\\n                                break; */\\n                        case '10': // Heartbeat\\n                            var heartbeat = hexToAscii(value);\\n                            event_time = moment.utc().unix();\\n                            if (index < total_length + 16) {\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\n                                key = message.substring(index, index = index + 2);\\n                                if (key == '24') {\\n                                    //     debug('key: ' + key) //comment those out\\n                                    value = message.substring(index, index = index + keyLength - 2);\\n                                    //    debug(value)\\n                                    var timestampHex = value.substring(0, 8);\\n                                    //    debug('timestampt hex: ' + timestampHex)\\n                                    timestampHex = changeEndianness(timestampHex);\\n                                    timestamp = hexToDecimal(timestampHex);\\n                                    event_time = timestamp;\\n                                    //    debug(event_time)\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\n                                    //    debug(statusHex)\\n                                    var statusInt = hexToDecimal(statusHex);\\n                                    var statusDevice = '';\\n                                    if ((statusInt & 1) == 1) {\\n                                        statusDevice += 'GPS,';\\n                                    }\\n                                    if ((statusInt & 2) == 2) {\\n                                        statusDevice += 'WIFISource,';\\n                                    }\\n                                    if ((statusInt & 4) == 4) {\\n                                        statusDevice += 'CellTower,';\\n                                    }\\n                                    if ((statusInt & 8) == 8) {\\n                                        statusDevice += 'BLELocation,';\\n                                    }\\n                                    if ((statusInt & 16) == 16) {\\n                                        statusDevice += 'Charging,';\\n                                    }\\n                                    if ((statusInt & 32) == 32) {\\n                                        statusDevice += 'FUllyCharged,';\\n                                    }\\n                                    if ((statusInt & 64) == 64) {\\n                                        statusDevice += 'Reboot,';\\n                                    }\\n                                    if ((statusInt & 128) == 128) {\\n                                        statusDevice += 'HistoricalData,';\\n                                    }\\n                                    if ((statusInt & 256) == 256) {\\n                                        statusDevice += 'AGPSDataValid,';\\n                                    }\\n                                    if ((statusInt & 512) == 512) {\\n                                        statusDevice += 'Motion,';\\n                                    }\\n                                    if ((statusInt & 1024) == 1024) {\\n                                        statusDevice += 'SmartLocating,';\\n                                    }\\n                                    if ((statusInt & 2048) == 2048) {\\n                                        statusDevice += 'BeaconLocation,';\\n                                    }\\n                                    if ((statusInt & 4096) == 4096) {\\n                                        statusDevice += 'BLEConnected,';\\n                                    }\\n                                    statusDevice = statusDevice.slice(0, -1);\\n                                    //   debug('statusHex:' + statusHex)\\n                                    statusHex = (statusHex);\\n                                    statusHex = hexToBin(statusHex);\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                                    //    debug(statusHex)\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                                    //    debug(battery_percentage)\\n                                    //    debug(battery_percentage)\\n                                    //    debug(statusHex.substring(8, 13))\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                                    //    debug(cellNetworkSignal)\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\n                                    //    debug(workMode)\\n                                    general += 'statusDevice:' + statusDevice + ';';\\n                                    if (battery_percentage) {\\n                                        general += 'battery:' + battery_percentage + ';';\\n                                    }\\n                                    if (cellNetworkSignal) {\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n                                    }\\n                                    if (workMode) {\\n                                        general += 'workMode:' + workMode + ';';\\n                                    }\\n                                }\\n                            }\\n                            // revisar\\n                            var gen_location = '0';\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '12': // Device requesting timestamp\\n                            timestamp = moment.utc().unix();\\n                            timestampHex = decimalToHex(timestamp);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n                            // respond to device with the timestamp of the server\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '21': //Cell Towers\\n                            var mccHex = value.substring(0, 2);\\n                            var mncHex = value.substring(2, 3);\\n                            var mcc = hexToDecimal(mccHex);\\n                            var mnc = hexToDecimal(mncHex);\\n                            var numTowers = (keyLength - 4) / 5;\\n                            var cellTowers = hexToAscii(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '22': // WIFI locations \\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            gen_location = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            gen_location = gen_location.slice(0, -1);\\n                            general += gen_location;\\n                            //CustomID is not provided so far with command type 03\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            alarmCode = '';\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '04') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7E') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7F') {\\n                // while (index < total_length + 16) {\\n                var keyLength = message.substring(index, index = index + 2);\\n                keyLength = 2 * hexToDecimal(keyLength);\\n                var key = message.substring(index, index = index + 2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                var value = message.substring(index, index = index + keyLength - 2);\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n                //}\\n            }\\n            if (command == 'FE') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            // prepare the ACK msg and change config if it is needed\\n            lengthAck = messageBody.length / 2;\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n            ////////////checksum CRC 16\\n            var checksumAck = byteStringToByteArray(messageBody);\\n            checksumAck = crc16byte(checksumAck);\\n            checksumAck = decimalToHex(checksumAck);\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\n            // To send ACK to the device previous to internal msg with parts\\n            if (needsAck == true) {\\n                if (messageBody.length <= 2) {\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n                } else {\\n                    ack = prefix + messageBody;\\n                }\\n                AddValue(codeValues, 'imei', imei);\\n                AddValue(codeValues, 'ack', ack);\\n            }\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n            if (i >= 0) {\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n    // Auxiliary functions\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n        const dataToReceiver = {\\n            values: codeValues\\n        };\\n        if (configsToAck.length > 0) {\\n            dataToReceiver.configsToAck = configsToAck;\\n        }\\n        if (configsToUpdate.length > 0) {\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\n        }\\n        if (configsToSend.length > 0) {\\n            dataToReceiver.configsToSend = configsToSend;\\n        }\\n        return dataToReceiver;\\n    }\\n\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        var cvpair = {\\n            code: p1,\\n            value: p2\\n        };\\n        codeValueArray.push(cvpair);\\n    }\\n    // convert functions\\n    function asciiToHex(str) { // ascii to hex \\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n    }\\n\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n        const bytes = [];\\n        for (let i = 0; i < str.length; i += 2) {\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n                bytes.push(byte);\\n            }\\n        }\\n        return bytes;\\n    }\\n\\n    function decimalToHex(x) {\\n        return Number(x).toString(16).toUpperCase();\\n    }\\n\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n        const bin = parseInt(hex, 16).toString(2);\\n        return bin.padStart(hex.length * 4, '0');\\n    }\\n\\n    function hexToAscii(hex) {\\n        if (hex.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 !== 0) {\\n            hex = '0' + hex;\\n        }\\n        const num = parseInt(hex, 16);\\n        const bits = hex.length * 4;\\n        const maxVal = 2 ** bits;\\n        return num >= maxVal / 2 ? num - maxVal : num;\\n    }\\n\\n    function hexToDecimal(hex) {\\n        return parseInt(hex, 16);\\n    }\\n    // CheckSum and debug functions\\n    function changeEndianness(hexString) { // changeEndianness\\n        if (hexString.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\n            .reverse() // invierte el orden\\n            .join('');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n        const bytes = byteStringToByteArray(payloadData);\\n        const crc = crc16byte(bytes);\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n        return changeEndianness(hex);\\n    }\\n\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n        let crc = 0x0000;\\n        for (const byte of byteArray) {\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\n            }\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\n            crc = crcTable[index] ^ (crc << 8);\\n        }\\n        return crc & 0xFFFF;\\n    }\\n\\n    function debug(...args) { // write debug info to console log, if localTesting\\n        if (localTesting) {\\n            console.debug('[DEBUG]', ...args);\\n        }\\n    }\\n    /*\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n        var server;\\n        if (localTesting) {\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5878, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5878, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }*/\\n    function sendMessageToLocalhostNoWait(message) {\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\n        const port = '5678'; //acceptance-dev\\n        if (localTesting) {\\n            console.debug('[DEBUG] Sending message to test server:', message);\\n        }\\n        const client = net.createConnection(port, server, () => {\\n            client.write(message);\\n            client.end();\\n        });\\n        client.on('error', (err) => {\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n        });\\n        client.on('end', () => {\\n            if (localTesting) {\\n                console.debug('[DEBUG] Connection closed');\\n            }\\n        });\\n    }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n    module.exports = {\\n        execute_ops\\n    }\\n} else { // on server use local defined vars\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n    // define global returns\\n    msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744278584},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n    ///////////////////////////////////////////////////////////////////////////////\\n    //\\n    // Roam protocol - please see variables and typical values in order below\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n    //\\n    // Author: Juanmi Navarro\\n    // Created: 01/01/0000\\n    // Last modified: 22/03/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        let localTesting = \\\"False\\\";\\n    }\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n    ];\\n    var codeValues = [];\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\n    var dataToReceiver = [];\\n    var configsToAck = [];\\n    var configsToUpdate = [];\\n    var configsToSend = [];\\n    if (globalTemplate == \\\"True\\\") {\\n        if (raw.startsWith('esendex')) {\\n            AddValue(codeValues, 'rawMsg', raw);\\n            //general SMS message\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\n            return;\\n        }\\n        AddValue(codeValues, 'raw', raw);\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\n        var homeBeacon = '';\\n        var homeWiFi = '';\\n        var contacts = '';\\n        var gps_data = '';\\n        var wifi_data = '';\\n        var status_data = '';\\n        var lbs_data = '';\\n        var beacon_data = '';\\n        var ble_data = '';\\n        var smart_data = '';\\n        //parse header & properties\\n        var message = rawFromBytes;\\n        var properties = message.substring(2, 4);\\n        var lengthLittleEndian = message.substring(4, 8);\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\n        var messageForReceiver;\\n        var sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        var index = 18;\\n        var prefix = 'AB' + '00';\\n        var lengthAck = 0;\\n        var ack = '';\\n        var needsAck = false;\\n        var hasConfigs = false;\\n        var general = '';\\n        var timestamp = '';\\n        var info = '';\\n        var customID = '';\\n        latitude = 0;\\n        longitude = 0;\\n        location_accuracy = 0; // GPS location adds the accuracy\\n        location_time = event_time = '';\\n        speed = 0.0;\\n        var location_type = '0';\\n        //var gen_location = '0'; \\n        var i; // general loop counter\\n        var battery_percentage = '';\\n        var cellNetworkSignal = '';\\n        var workMode = '';\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\n            needsAck = true;\\n        }\\n        // Loop to decode multi-ACK msg\\n        if (message.includes('AB00030008C7')) {\\n            const multiack = message.split('AB00');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB00' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            } // FOR multiACK\\n        } else decoder(message); // IF multiACK\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\n        AddValue(codeValues, 'rawMsg', raw);\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\n            var gen_location = params.gps_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var location_accuracy = gen_location[2];\\n            var speed = gen_location[3];\\n            var direction = gen_location[4];\\n            var altitude = gen_location[5];\\n            var satellites = gen_location[6];\\n            var mileage = gen_location[7];\\n            if (location_accuracy !== 0) {\\n                var fix_state = 1;\\n            } else {\\n                var fix_state = 0;\\n            }\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            AddValue(codeValues, 'speed', speed);\\n            AddValue(codeValues, 'direction', direction);\\n            AddValue(codeValues, 'altitude', altitude);\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\n            AddValue(codeValues, 'mileage', mileage);\\n            AddValue(codeValues, 'satellites', satellites);\\n            AddValue(codeValues, 'fix_state', fix_state);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\n            var variables = []; //Define array\\n            variables = params.lbs_data.split(',');\\n            var index = 2;\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\n                    AddValue(codeValues, 'mcc', variables[0]);\\n                    AddValue(codeValues, 'mnc', variables[1]);\\n                    AddValue(codeValues, 'lac', variables[index]);\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\n                }\\n                index += 3;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\n            var bssid_array = params.wifi_data.split(',');\\n            var index = 0;\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\n                }\\n                index += 2;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        //  when Beacon is detected and it isn't flic BLE detected\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\n            var gen_location = params.beacon_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var mac = gen_location[2];\\n            var label = gen_location[3];\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac) {\\n                AddValue(codeValues, 'beacon_mac', mac);\\n                var simpleQuery = [{\\n                    'code': 'Mac',\\n                    'value': mac,\\n                }];\\n                var simpleQueryLabel = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery\\n                };\\n                var labels = [];\\n                labels.push(JSON.stringify(simpleQueryLabel));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\n            var gen_location = params.ble_data.split(',');\\n            var flag = gen_location[0];\\n            var batLevel = gen_location[1];\\n            var mac2 = gen_location[2];\\n            //var label = gen_location[3];\\n            AddValue(codeValues, 'flagBLE', flag);\\n            AddValue(codeValues, 'batBLE', batLevel);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac2) {\\n                AddValue(codeValues, 'beacon_mac', mac2);\\n                var simpleQuery2 = [{\\n                    'code': 'Mac',\\n                    'value': mac2,\\n                }];\\n                var simpleQueryLabel2 = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery2\\n                };\\n                var labels2 = [];\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        /*  meter mas tarde...   \\n            if (params.smart_data !== 'undefined') {\\n                var gen_location = params.smart_data.split(',')\\n                var latitude = gen_location[0]\\n                var longitude = gen_location[1]\\n                var location_accuracy = gen_location[2]\\n                var altitude = gen_location[3]\\n                AddValue(codeValues,'latitude', latitude);\\n                AddValue(codeValues,'longitude', longitude);\\n                AddValue(codeValues,'altitude', altitude);\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\n            }\\n          */\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues,'event_time', event_time);\\n        }  revisar mas adelante*/\\n        // to parse SMS info from the device\\n        switch (messageTypeLocalCode) {\\n            case 'COMM-SMS': // SMS message sent in\\n                if (params.data.startsWith('Device location request')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('IMEI:')) {\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n                } else if (params.data.startsWith('flush ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('Set Roam-')) {\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\n                } else if (params.data.startsWith('set live tracking')) {\\n                    configsToAck.push(configIds.Controls.Trace);\\n                } else if (params.data.startsWith('reboot ok')) {\\n                    configsToAck.push(configIds.Controls.Reboot);\\n                } else if (params.data.startsWith('GPS')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                    var i1 = params.data.search('Now:')\\n                    var i2 = params.data.search('Loc Time:')\\n                    var i3 = params.data.search('Speed:')\\n                    var i4 = params.data.search('Altitude:')\\n                    var i5 = params.data.search('Battery:')\\n                    var i6 = params.data.search('google')\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                        Speed = Speed * 0.44704\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                        Speed = Speed / 3.6\\n                    }\\n                    var latlong = params.data.substring(i6 + 18)\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                break;\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\n                //var i1 = params.data.search('IMEI:')\\n                //var i2 = params.data.search('GSM signal quality:')\\n                var i3 = params.data.search('Software version:')\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\n                var i4 = sub.search('version:');\\n                var fwVersion = sub.substring(i4, sub.length);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                break;\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\n                var i1 = params.data.search('Fall alarm:');\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\n                var i2 = params.data.search('level:');\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\n                break;\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\n                var i1 = raw.search('1,');\\n                //var i2 = params.data.search('2,');\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                break;\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = raw.search('A1:');\\n                if (raw.includes('A2:')) {\\n                    var i2 = raw.search('A2:');\\n                } else {\\n                    var i2 = raw.search('A10:');\\n                }\\n                var tel = raw.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                i2 = raw.search('A10:')\\n                tel = raw.substring(i2 + 4, raw.length);\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                break;\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = params.data.search('APN:')\\n                var i2 = params.data.search('IP:')\\n                var i3 = params.data.search('Move')\\n                var apn = params.data.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"apn\\\", apn);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\n                var i3 = params.data.search('Speed:')\\n                var i4 = params.data.search('Altitude:')\\n                var i5 = params.data.search('Battery:')\\n                var i6 = params.data.search('google')\\n                var eventTime = params.data.substring(0, i3)\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                    Speed = Speed * 0.44704\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                    Speed = Speed / 3.6\\n                }\\n                var latlong = params.data.substring(i6 + 18)\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n        }\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues, 'event_time', event_time);\\n        }\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n        //    var location_time = moment.utc().unix();\\n        //    AddValue(codeValues, 'location_time', location_time);\\n        //}\\n    }\\n    // send data msg to kibana\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n    console.log(data);\\n    return data\\n    // end of main operation\\n    // define functions used in operation\\n    // decode global msg\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\n        var checksum = message.substring(8, 12);\\n        var messageBody = message.substring(16, message.length);\\n        debug('message =' + message);\\n        debug('checksum =' + checksum);\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n            debug(\\\"message has valid checksum\\\");\\n            var messageBody = command; // update value for the ACK\\n            debug('command =' + command);\\n            if (command == '01') {\\n                while (index < total_length + 16) {\\n                    // gen_location = '0'; //cambiado 30/09\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        //Device ID\\n                        case '01':\\n                            var imei = hexToAscii(value);\\n                            break;\\n                            //Alarm code\\n                        case '02':\\n                            var alarm = 'CYC';\\n                            var alarmCode = value.substring(0, 8);\\n                            alarmCode = changeEndianness(alarmCode);\\n                            var timestampHex = value.substring(8, 16);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            event_time = timestamp;\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\n                            var alarmCodeExt = value.substring(16, 24);\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n                            //Extended Alerts\\n                            // Fall off\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Standard Alerts\\n                            //Battery low\\n                            else if ((alarmCodeInt & 1) == 1) {\\n                                var alarm = 'BATL';\\n                            }\\n                            //Overspeed\\n                            else if ((alarmCodeInt & 2) == 2) {\\n                                var alarm = 'ALSP';\\n                            }\\n                            //Fall\\n                            else if ((alarmCodeInt & 4) == 4) {\\n                                var alarm = 'ALF';\\n                            }\\n                            //Tilt\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'Tilt';\\n                            } else if ((alarmCodeInt & 16) == 16) {\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\n                                    var alarm = 'Geo1-IN';\\n                                } else {\\n                                    var alarm = 'Geo1-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 32) == 32) {\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\n                                    var alarm = 'Geo2-IN';\\n                                } else {\\n                                    var alarm = 'Geo2-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 64) == 64) {\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\n                                    var alarm = 'Geo3-IN';\\n                                } else {\\n                                    var alarm = 'Geo3-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 128) == 128) {\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\n                                    var alarm = 'Geo4-IN';\\n                                } else {\\n                                    var alarm = 'Geo4-OUT';\\n                                }\\n                            }\\n                            //Power Off\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\n                                var alarm = 'Side2';\\n                            }\\n                            //Battery charging\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\n                                var alarm = 'BATCN';\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                            }\\n                            //SOS Ending\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'SOSEnding';\\n                                info = 'Alarm Finished';\\n                            }\\n                            //Amber Alert  EC03 only\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALAO';\\n                            }\\n                            // welfare Alert check-in ALA-O\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'ALA-O';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\n                            //    var alarm = 'ALA-C';\\n                            //}\\n                            // Fall-Down Alert ending\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // welfare Alert Ending  ALA\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\n                            //    var alarm = 'BEA';\\n                            //}\\n                            general += 'alarm:' + alarm + ',';\\n                            break;\\n                            //Custom ID\\n                        case '03':\\n                            // in value is customID.... '06' for Watch Care\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //update customID to check if belongs to this type of device\\n                            customID = value;\\n                            if (value != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                // exit decoder\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n                                // console.log(data);\\n                                return // data\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    //return;\\n                                }\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                general += 'customID:' + value + ',';\\n                                break;\\n                            }\\n                            //Historical Data Completed\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\n                            var histData = true;\\n                            break;\\n                            //GPS location\\n                        case '20':\\n                            location_type = 'GPS';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var speedHex = value.substring(16, 20);\\n                            var directionHex = value.substring(20, 24);\\n                            var altitudeHex = value.substring(24, 28);\\n                            var location_accuracyHex = value.substring(28, 32);\\n                            var mileageHex = value.substring(32, 40);\\n                            var satellitesHex = value.substring(40, 42);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            // Range: 0.5 to 99.9  \\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n                            var satellites = hexToDecimal(satellitesHex);\\n                            // location_time = timestamp;\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //WIFI Towers\\n                        case '22':\\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            wifi_data = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            wifi_data = wifi_data.slice(0, -1);\\n                            general += wifi_data;\\n                            break;\\n                            //BLE Location  Added 10/10/22\\n                        case '23':\\n                            location_type = 'BLE';\\n                            var mac = value.substring(0, 12);\\n                            var latitudeHex = value.substring(12, 20);\\n                            var longitudeHex = value.substring(20, 28);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var address = hexToAscii(value.substring(28, value.length));\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            // location_time = timestamp;\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //General Data ,  status_data\\n                        case '24':\\n                            //var general = 'true'\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            }\\n                            //else {\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n                            //}\\n                            // reset variables\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            var timestampHex = value.substring(0, 8);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            location_time = timestamp;\\n                            event_time = timestamp;\\n                            // HardCode to fix possible issue in protocol\\n                            //event_time = moment.utc().unix();\\n                            // end of hard code\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\n                            var statusInt = hexToDecimal(statusHex);\\n                            var statusDevice = '';\\n                            if ((statusInt & 1) == 1) {\\n                                statusDevice += 'GPS,';\\n                            }\\n                            if ((statusInt & 2) == 2) {\\n                                statusDevice += 'WIFISource,';\\n                            }\\n                            if ((statusInt & 4) == 4) {\\n                                statusDevice += 'CellTower,';\\n                            }\\n                            if ((statusInt & 8) == 8) {\\n                                statusDevice += 'BLELocation,';\\n                            }\\n                            //params.BatteryStatus.BatteryStatus = '1';\\n                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // var alarm = 'BATCN';\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '1';\\n                                     var alarm = 'BATCN';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            if ((statusInt & 32) == 32) {\\n                                statusDevice += 'FUllyCharged,';\\n                                //var alarm = 'BATF';\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '3';\\n                                     var alarm = 'BATF';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n                                 statusDevice += 'Not Charging,';\\n                                 var alarm = 'BATCF';\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\n                                       var batteryStatus = '2';\\n                                       var alarm = 'BATCF';\\n                                       let configsToUpdate = [];\\n                                       configsToUpdate.push({\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\n                                           'value': batteryStatus\\n                                       });\\n                                   }\\n                             }*/\\n                            if ((statusInt & 64) == 64) {\\n                                statusDevice += 'Reboot,';\\n                            }\\n                            if ((statusInt & 128) == 128) {\\n                                statusDevice += 'HistoricalData,';\\n                            }\\n                            if ((statusInt & 256) == 256) {\\n                                statusDevice += 'AGPSDataValid,';\\n                            }\\n                            if ((statusInt & 512) == 512) {\\n                                statusDevice += 'Motion,';\\n                            }\\n                            if ((statusInt & 1024) == 1024) {\\n                                statusDevice += 'SmartLocating,';\\n                            }\\n                            if ((statusInt & 2048) == 2048) { //isHome\\n                                statusDevice += 'BeaconLocation,';\\n                            }\\n                            if ((statusInt & 4096) == 4096) {\\n                                statusDevice += 'BLEConnected,';\\n                            }\\n                            if ((statusInt & 16384) == 16384) {\\n                                statusDevice += 'HomeWiFi,';\\n                            }\\n                            statusDevice = statusDevice.slice(0, -1);\\n                            status_data = statusDevice; //to oysta template\\n                            //statusHex = (statusHex);\\n                            statusHex = hexToBin(statusHex);\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\n                            general += 'statusDevice:' + statusDevice + ',';\\n                            if (battery_percentage) {\\n                                general += 'battery:' + battery_percentage + ',';\\n                            }\\n                            if (cellNetworkSignal) {\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n                            }\\n                            if (workMode) {\\n                                general += 'workMode:' + workMode + ',';\\n                            }\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n                            break;\\n                            //Call Records\\n                        case '25':\\n                            //Needed?\\n                            break;\\n                            //BLE Location 2\\n                        case '26':\\n                            //I don't understand\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Smart Location\\n                        case '27':\\n                            location_type = 'SMART';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var location_accuracyHex = value.substring(16, 20);\\n                            var altitudeHex = value.substring(20, 24);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //location_time = timestamp;\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //Beacon Location  Added 11/10/22\\n                        case '28':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                                descr = hexToAscii(value.substring(34, value.length));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            // var latitudeHex = value.substring(18, 26);\\n                            // var longitudeHex = value.substring(26, 34);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            // Beacon V2\\n                        case '2C':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(20, 28);\\n                                longitudeHex = value.substring(28, 36);\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            //Cell Towers Note\\n                        case '29':\\n                            location_type = 'LBS';\\n                            lbs_data = '';\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\n                            var mncHex = value.substring(4, 6);\\n                            var mcc = hexToDecimal(mccHex);\\n                            lbs_data += mcc + ',';\\n                            var mnc = hexToDecimal(mncHex);\\n                            lbs_data += mnc + ',';\\n                            var indexLbs = 6;\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n                            for (let i = 0; i < numTowers; i++) {\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n                                var rxl = hexToDecimal(rxlHex);\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n                                var lac = hexToDecimal(lacHex);\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n                                indexLbs += 14;\\n                            }\\n                            lbs_data = lbs_data.slice(0, -1);\\n                            general += lbs_data;\\n                            break;\\n                        case '30':\\n                            //G-sensor. \\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numStep = (keyLength - 2) / 16;\\n                            for (let j = 0; j < numStep; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var stepHex = value.substring(8, 16);\\n                                stepHex = changeEndianness(stepHex);\\n                                var stepRate = hexToDecimal(stepHex);\\n                                info = stepRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'STP';\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //Activity\\n                        case '31':\\n                            //I don't understand\\n                            break;\\n                            //BLE MAC list\\n                        case '32':\\n                            //I don't understand\\n                            break;\\n                            //Beacon List\\n                        case '33':\\n                            //I don't understand\\n                            break;\\n                            //Heart Rate Data\\n                        case '40':\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numHeartRate = (keyLength - 2) / 12;\\n                            for (let j = 0; j < numHeartRate; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var heartRateHex = value.substring(8, 10);\\n                                var heartRate = hexToDecimal(heartRateHex);\\n                                var trustLevelHex = value.substring(10, 12);\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\n                                info = heartRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'HRT';\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //BLE Connected  . For Flic button\\n                        case '62':\\n                            location_type = 'BLE';\\n                            //var alarm = 'EBZI'; \\n                            //var latitudeHex = '00';\\n                            //var longitudeHex = '00';\\n                            //var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n                            //location_time = timestamp;\\n                            ble_data = `${flag},${batLevel},${mac}`;\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n                            break;\\n                    }\\n                }\\n                if (alarmCode) {\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                } else if (statusDevice) {\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                /*else if (alarm === 'HRT') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else if (alarm === 'STP') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else {\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           }*/\\n                // rest the alarm value\\n                alarm = '';\\n            }\\n            if (command == '02') {\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    switch (key) {\\n                        //Module Number\\n                        case '01':\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Firmware version\\n                        case '02':\\n                            //no ACK need\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1A':\\n                            //no ACK need\\n                            var fwVersion = hexToAscii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            break;\\n                            //IMEI\\n                        case '03':\\n                            var imei = hexToDecimal(value);\\n                            // harcode to avoid conflicts with Rio protocol\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\n                            //    return\\n                            //}\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //ICCID\\n                        case '04':\\n                            var iccid = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //BLE-MAC\\n                        case '05':\\n                            var bleMac = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Run Time\\n                        case '07':\\n                            var runTime = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '10': // Ringer Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\n                            break;\\n                        case '0A': //Performance  mode\\n                            //var workMode = hexToDecimal(value);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            break;\\n                        case '1B':\\n                            //Decimal o ascii?\\n                            var gsmModule = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1F':\\n                            //System Language\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n                            break;\\n                        case '33': // phone option\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n                                var auto = 'true';\\n                            } else var auto = 'false';\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                allow = 'true';\\n                            } else var allow = 'false';\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            break;\\n                        case '30': //ContactList\\n                            var contactNumber = value.substring(1, 2);\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\n                            var tel = '';\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                case '0':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n                                    break;\\n                                    // Gateway Number\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n                                        tel = 'Esendex UK'\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n                                        tel = 'Esendex Spain'\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n                                        tel = 'Esendex UK Acceptance'\\n                                    } else {\\n                                        tel = 'Default'\\n                                    }\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                                    break;\\n                                default:\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) {\\n                                        contacts += '';\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                        break;\\n                                    }\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n                                    contacts += tel + ', ';\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                    break;\\n                            }\\n                            break;\\n                        case '40': // APN\\n                            //no ACK need\\n                            var apn = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                            break;\\n                        case '43': //Server Details\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\n                                serverDetails = 'Production'\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\n                                serverDetails = 'Acceptance'\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\n                                serverDetails = 'Protocol-Import'\\n                            } else {\\n                                serverDetails = 'Default'\\n                            }\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                            break;\\n                        case '44': //time interval - work mode intervals\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            var workMode = 0;\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\n                                //workMode = 'High Frequency';\\n                                workMode = 3;\\n                            }\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\n                                //workMode = 'Balanced';\\n                                workMode = 2;\\n                            }\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\n                                //workMode = 'Power Saving';\\n                                workMode = 1;\\n                            }\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\n                                //workMode = 'No Reporting';\\n                                workMode = 0;\\n                            }\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '47': // Custom Id\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\n                            configsToAck.push(configIds.ReadState.CustomId);\\n                            break;\\n                        case '53': // Non motion alert\\n                            //2B020080\\n                            var status = hexToBin(value.substring(6, 8));\\n                            var alertSetting = '';\\n                            var enableDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enableDisable = '1';\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                            };\\n                            //if (status.substring(5, 6) == '1') {\\n                            //    alertSetting += 'Dial, '\\n                            //} else {\\n                            //    alertSetting += 'No Dial, '\\n                            //};\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\n                            var enalbleDisable = '';\\n                            //if (fallStatus.substring(4, 5) == '1') {\\n                            if (fallStatus.substring(0, 1) == '1') {\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                var sensibility = 'Disable, '\\n                            };\\n                            if (fallStatus.substring(5, 6) == '1') {\\n                                sensibility += 'Dial, '\\n                            } else {\\n                                sensibility += 'No Dial, '\\n                            };\\n                            var imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n                            sensibility += sesibityOptionValue;\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n                            homeBeacon += beaconStatus + ', ';\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '4A': //Wifi Network List\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n                            var wifiStatus = value.substring(0, 1);\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n                            /var homeWifi = '';\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\n                                if (wifiStatus == '8') {\\n                                    homeWifi += ' Enable, '\\n                                    enalbleDisable = '1';\\n                                } else {\\n                                    homeWifi += ' Disable, '\\n                                    //enalbleDisable = '0';\\n                                };*/\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                            }\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n                            break;\\n                        case '21': // Speed Dial Settings\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '03') {\\n                while (index < total_length + 16) {\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        case '01': // Device ID\\n                            var imei = hexToAscii(value);\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                return;\\n                            }\\n                            break;\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /* case '03':\\n                                //update customID to check if belongs to this type of device\\n                                customID = value;\\n                                if (value != '04') {\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    return\\n                                } else {\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    }\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    general += 'customID:' + value + ',';\\n                                    break;\\n                                }\\n                                break; */\\n                        case '10': // Heartbeat\\n                            var heartbeat = hexToAscii(value);\\n                            event_time = moment.utc().unix();\\n                            if (index < total_length + 16) {\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\n                                key = message.substring(index, index = index + 2);\\n                                if (key == '24') {\\n                                    //     debug('key: ' + key) //comment those out\\n                                    value = message.substring(index, index = index + keyLength - 2);\\n                                    //    debug(value)\\n                                    var timestampHex = value.substring(0, 8);\\n                                    //    debug('timestampt hex: ' + timestampHex)\\n                                    timestampHex = changeEndianness(timestampHex);\\n                                    timestamp = hexToDecimal(timestampHex);\\n                                    event_time = timestamp;\\n                                    //    debug(event_time)\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\n                                    //    debug(statusHex)\\n                                    var statusInt = hexToDecimal(statusHex);\\n                                    var statusDevice = '';\\n                                    if ((statusInt & 1) == 1) {\\n                                        statusDevice += 'GPS,';\\n                                    }\\n                                    if ((statusInt & 2) == 2) {\\n                                        statusDevice += 'WIFISource,';\\n                                    }\\n                                    if ((statusInt & 4) == 4) {\\n                                        statusDevice += 'CellTower,';\\n                                    }\\n                                    if ((statusInt & 8) == 8) {\\n                                        statusDevice += 'BLELocation,';\\n                                    }\\n                                    if ((statusInt & 16) == 16) {\\n                                        statusDevice += 'Charging,';\\n                                    }\\n                                    if ((statusInt & 32) == 32) {\\n                                        statusDevice += 'FUllyCharged,';\\n                                    }\\n                                    if ((statusInt & 64) == 64) {\\n                                        statusDevice += 'Reboot,';\\n                                    }\\n                                    if ((statusInt & 128) == 128) {\\n                                        statusDevice += 'HistoricalData,';\\n                                    }\\n                                    if ((statusInt & 256) == 256) {\\n                                        statusDevice += 'AGPSDataValid,';\\n                                    }\\n                                    if ((statusInt & 512) == 512) {\\n                                        statusDevice += 'Motion,';\\n                                    }\\n                                    if ((statusInt & 1024) == 1024) {\\n                                        statusDevice += 'SmartLocating,';\\n                                    }\\n                                    if ((statusInt & 2048) == 2048) {\\n                                        statusDevice += 'BeaconLocation,';\\n                                    }\\n                                    if ((statusInt & 4096) == 4096) {\\n                                        statusDevice += 'BLEConnected,';\\n                                    }\\n                                    statusDevice = statusDevice.slice(0, -1);\\n                                    //   debug('statusHex:' + statusHex)\\n                                    statusHex = (statusHex);\\n                                    statusHex = hexToBin(statusHex);\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                                    //    debug(statusHex)\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                                    //    debug(battery_percentage)\\n                                    //    debug(battery_percentage)\\n                                    //    debug(statusHex.substring(8, 13))\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                                    //    debug(cellNetworkSignal)\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\n                                    //    debug(workMode)\\n                                    general += 'statusDevice:' + statusDevice + ';';\\n                                    if (battery_percentage) {\\n                                        general += 'battery:' + battery_percentage + ';';\\n                                    }\\n                                    if (cellNetworkSignal) {\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n                                    }\\n                                    if (workMode) {\\n                                        general += 'workMode:' + workMode + ';';\\n                                    }\\n                                }\\n                            }\\n                            // revisar\\n                            var gen_location = '0';\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n                            messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '12': // Device requesting timestamp\\n                            timestamp = moment.utc().unix();\\n                            timestampHex = decimalToHex(timestamp);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n                            // respond to device with the timestamp of the server\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '21': //Cell Towers\\n                            var mccHex = value.substring(0, 2);\\n                            var mncHex = value.substring(2, 3);\\n                            var mcc = hexToDecimal(mccHex);\\n                            var mnc = hexToDecimal(mncHex);\\n                            var numTowers = (keyLength - 4) / 5;\\n                            var cellTowers = hexToAscii(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '22': // WIFI locations \\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            gen_location = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            gen_location = gen_location.slice(0, -1);\\n                            general += gen_location;\\n                            //CustomID is not provided so far with command type 03\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            alarmCode = '';\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '04') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7E') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7F') {\\n                // while (index < total_length + 16) {\\n                var keyLength = message.substring(index, index = index + 2);\\n                keyLength = 2 * hexToDecimal(keyLength);\\n                var key = message.substring(index, index = index + 2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                var value = message.substring(index, index = index + keyLength - 2);\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n                //}\\n            }\\n            if (command == 'FE') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            // prepare the ACK msg and change config if it is needed\\n            lengthAck = messageBody.length / 2;\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n            ////////////checksum CRC 16\\n            var checksumAck = byteStringToByteArray(messageBody);\\n            checksumAck = crc16byte(checksumAck);\\n            checksumAck = decimalToHex(checksumAck);\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\n            // To send ACK to the device previous to internal msg with parts\\n            if (needsAck == true) {\\n                if (messageBody.length <= 2) {\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n                } else {\\n                    ack = prefix + messageBody;\\n                }\\n                AddValue(codeValues, 'imei', imei);\\n                AddValue(codeValues, 'ack', ack);\\n            }\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n            if (i >= 0) {\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n    // Auxiliary functions\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n        const dataToReceiver = {\\n            values: codeValues\\n        };\\n        if (configsToAck.length > 0) {\\n            dataToReceiver.configsToAck = configsToAck;\\n        }\\n        if (configsToUpdate.length > 0) {\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\n        }\\n        if (configsToSend.length > 0) {\\n            dataToReceiver.configsToSend = configsToSend;\\n        }\\n        return dataToReceiver;\\n    }\\n\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        var cvpair = {\\n            code: p1,\\n            value: p2\\n        };\\n        codeValueArray.push(cvpair);\\n    }\\n    // convert functions\\n    function asciiToHex(str) { // ascii to hex \\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n    }\\n\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n        const bytes = [];\\n        for (let i = 0; i < str.length; i += 2) {\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n                bytes.push(byte);\\n            }\\n        }\\n        return bytes;\\n    }\\n\\n    function decimalToHex(x) {\\n        return Number(x).toString(16).toUpperCase();\\n    }\\n\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n        const bin = parseInt(hex, 16).toString(2);\\n        return bin.padStart(hex.length * 4, '0');\\n    }\\n\\n    function hexToAscii(hex) {\\n        if (hex.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 !== 0) {\\n            hex = '0' + hex;\\n        }\\n        const num = parseInt(hex, 16);\\n        const bits = hex.length * 4;\\n        const maxVal = 2 ** bits;\\n        return num >= maxVal / 2 ? num - maxVal : num;\\n    }\\n\\n    function hexToDecimal(hex) {\\n        return parseInt(hex, 16);\\n    }\\n    // CheckSum and debug functions\\n    function changeEndianness(hexString) { // changeEndianness\\n        if (hexString.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\n            .reverse() // invierte el orden\\n            .join('');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n        const bytes = byteStringToByteArray(payloadData);\\n        const crc = crc16byte(bytes);\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n        return changeEndianness(hex);\\n    }\\n\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n        let crc = 0x0000;\\n        for (const byte of byteArray) {\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\n            }\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\n            crc = crcTable[index] ^ (crc << 8);\\n        }\\n        return crc & 0xFFFF;\\n    }\\n\\n    function debug(...args) { // write debug info to console log, if localTesting\\n        if (localTesting) {\\n            console.debug('[DEBUG]', ...args);\\n        }\\n    }\\n    /*\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n        var server;\\n        if (localTesting) {\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5878, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5878, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }*/\\n    function sendMessageToLocalhostNoWait(message) {\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\n        const port = '5678'; //acceptance-dev\\n        if (localTesting) {\\n            console.debug('[DEBUG] Sending message to test server:', message);\\n        }\\n        const client = net.createConnection(port, server, () => {\\n            client.write(message);\\n            client.end();\\n        });\\n        client.on('error', (err) => {\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n        });\\n        client.on('end', () => {\\n            if (localTesting) {\\n                console.debug('[DEBUG] Connection closed');\\n            }\\n        });\\n    }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n    module.exports = {\\n        execute_ops\\n    }\\n} else { // on server use local defined vars\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n    // define global returns\\n    msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744367131},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n    ///////////////////////////////////////////////////////////////////////////////\\n    //\\n    // Roam protocol - please see variables and typical values in order below\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n    //\\n    // Author: Juanmi Navarro\\n    // Created: 01/01/0000\\n    // Last modified: 11/04/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        let localTesting = \\\"False\\\";\\n    }\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n    ];\\n    var codeValues = [];\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\n    var dataToReceiver = [];\\n    var configsToAck = [];\\n    var configsToUpdate = [];\\n    var configsToSend = [];\\n    if (globalTemplate == \\\"True\\\") {\\n        if (raw.startsWith('esendex')) {\\n            AddValue(codeValues, 'rawMsg', raw);\\n            //general SMS message\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\n            return;\\n        }\\n        AddValue(codeValues, 'raw', raw);\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\n        var homeBeacon = '';\\n        var homeWiFi = '';\\n        var contacts = '';\\n        var gps_data = '';\\n        var wifi_data = '';\\n        var status_data = '';\\n        var lbs_data = '';\\n        var beacon_data = '';\\n        var ble_data = '';\\n        var smart_data = '';\\n        //parse header & properties\\n        var message = rawFromBytes;\\n        var properties = message.substring(2, 4);\\n        var lengthLittleEndian = message.substring(4, 8);\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\n        var messageForReceiver;\\n        var sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        var index = 18;\\n        var prefix = 'AB' + '00';\\n        var lengthAck = 0;\\n        var ack = '';\\n        var needsAck = false;\\n        var hasConfigs = false;\\n        var general = '';\\n        var timestamp = '';\\n        var info = '';\\n        var customID = '';\\n        latitude = 0;\\n        longitude = 0;\\n        location_accuracy = 0; // GPS location adds the accuracy\\n        location_time = event_time = '';\\n        speed = 0.0;\\n        var location_type = '0';\\n        //var gen_location = '0'; \\n        var i; // general loop counter\\n        var battery_percentage = '';\\n        var cellNetworkSignal = '';\\n        var workMode = '';\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\n            needsAck = true;\\n        }\\n        // Loop to decode multi-ACK msg\\n        if (message.includes('AB00030008C7')) {\\n            const multiack = message.split('AB00');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB00' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            } // FOR multiACK\\n        } else decoder(message); // IF multiACK\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\n        AddValue(codeValues, 'rawMsg', raw);\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\n            var gen_location = params.gps_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var location_accuracy = gen_location[2];\\n            var speed = gen_location[3];\\n            var direction = gen_location[4];\\n            var altitude = gen_location[5];\\n            var satellites = gen_location[6];\\n            var mileage = gen_location[7];\\n            if (location_accuracy !== 0) {\\n                var fix_state = 1;\\n            } else {\\n                var fix_state = 0;\\n            }\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            AddValue(codeValues, 'speed', speed);\\n            AddValue(codeValues, 'direction', direction);\\n            AddValue(codeValues, 'altitude', altitude);\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\n            AddValue(codeValues, 'mileage', mileage);\\n            AddValue(codeValues, 'satellites', satellites);\\n            AddValue(codeValues, 'fix_state', fix_state);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\n            var variables = []; //Define array\\n            variables = params.lbs_data.split(',');\\n            var index = 2;\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\n                    AddValue(codeValues, 'mcc', variables[0]);\\n                    AddValue(codeValues, 'mnc', variables[1]);\\n                    AddValue(codeValues, 'lac', variables[index]);\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\n                }\\n                index += 3;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\n            var bssid_array = params.wifi_data.split(',');\\n            var index = 0;\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\n                }\\n                index += 2;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        //  when Beacon is detected and it isn't flic BLE detected\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\n            var gen_location = params.beacon_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var mac = gen_location[2];\\n            var label = gen_location[3];\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac) {\\n                AddValue(codeValues, 'beacon_mac', mac);\\n                var simpleQuery = [{\\n                    'code': 'Mac',\\n                    'value': mac,\\n                }];\\n                var simpleQueryLabel = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery\\n                };\\n                var labels = [];\\n                labels.push(JSON.stringify(simpleQueryLabel));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\n            var gen_location = params.ble_data.split(',');\\n            var flag = gen_location[0];\\n            var batLevel = gen_location[1];\\n            var mac2 = gen_location[2];\\n            //var label = gen_location[3];\\n            AddValue(codeValues, 'flagBLE', flag);\\n            AddValue(codeValues, 'batBLE', batLevel);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac2) {\\n                AddValue(codeValues, 'beacon_mac', mac2);\\n                var simpleQuery2 = [{\\n                    'code': 'Mac',\\n                    'value': mac2,\\n                }];\\n                var simpleQueryLabel2 = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery2\\n                };\\n                var labels2 = [];\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        /*  meter mas tarde...   \\n            if (params.smart_data !== 'undefined') {\\n                var gen_location = params.smart_data.split(',')\\n                var latitude = gen_location[0]\\n                var longitude = gen_location[1]\\n                var location_accuracy = gen_location[2]\\n                var altitude = gen_location[3]\\n                AddValue(codeValues,'latitude', latitude);\\n                AddValue(codeValues,'longitude', longitude);\\n                AddValue(codeValues,'altitude', altitude);\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\n            }\\n          */\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues,'event_time', event_time);\\n        }  revisar mas adelante*/\\n        // to parse SMS info from the device\\n        switch (messageTypeLocalCode) {\\n            case 'COMM-SMS': // SMS message sent in\\n                if (params.data.startsWith('Device location request')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('IMEI:')) {\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n                } else if (params.data.startsWith('flush ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('Set Roam-')) {\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\n                } else if (params.data.startsWith('set live tracking')) {\\n                    configsToAck.push(configIds.Controls.Trace);\\n                } else if (params.data.startsWith('reboot ok')) {\\n                    configsToAck.push(configIds.Controls.Reboot);\\n                } else if (params.data.startsWith('GPS')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                    var i1 = params.data.search('Now:')\\n                    var i2 = params.data.search('Loc Time:')\\n                    var i3 = params.data.search('Speed:')\\n                    var i4 = params.data.search('Altitude:')\\n                    var i5 = params.data.search('Battery:')\\n                    var i6 = params.data.search('google')\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                        Speed = Speed * 0.44704\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                        Speed = Speed / 3.6\\n                    }\\n                    var latlong = params.data.substring(i6 + 18)\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                break;\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\n                //var i1 = params.data.search('IMEI:')\\n                //var i2 = params.data.search('GSM signal quality:')\\n                var i3 = params.data.search('Software version:')\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\n                var i4 = sub.search('version:');\\n                var fwVersion = sub.substring(i4, sub.length);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                break;\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\n                var i1 = params.data.search('Fall alarm:');\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\n                var i2 = params.data.search('level:');\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\n                break;\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\n                var i1 = raw.search('1,');\\n                //var i2 = params.data.search('2,');\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                break;\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = raw.search('A1:');\\n                if (raw.includes('A2:')) {\\n                    var i2 = raw.search('A2:');\\n                } else {\\n                    var i2 = raw.search('A10:');\\n                }\\n                var tel = raw.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                i2 = raw.search('A10:')\\n                tel = raw.substring(i2 + 4, raw.length);\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                break;\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = params.data.search('APN:')\\n                var i2 = params.data.search('IP:')\\n                var i3 = params.data.search('Move')\\n                var apn = params.data.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"apn\\\", apn);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\n                var i3 = params.data.search('Speed:')\\n                var i4 = params.data.search('Altitude:')\\n                var i5 = params.data.search('Battery:')\\n                var i6 = params.data.search('google')\\n                var eventTime = params.data.substring(0, i3)\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                    Speed = Speed * 0.44704\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                    Speed = Speed / 3.6\\n                }\\n                var latlong = params.data.substring(i6 + 18)\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n        }\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues, 'event_time', event_time);\\n        }\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n        //    var location_time = moment.utc().unix();\\n        //    AddValue(codeValues, 'location_time', location_time);\\n        //}\\n    }\\n    // send data msg to kibana\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n    console.log(data);\\n    return data\\n    // end of main operation\\n    // define functions used in operation\\n    // decode global msg\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\n        var checksum = message.substring(8, 12);\\n        var messageBody = message.substring(16, message.length);\\n        debug('message =' + message);\\n        debug('checksum =' + checksum);\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n            debug(\\\"message has valid checksum\\\");\\n            var messageBody = command; // update value for the ACK\\n            debug('command =' + command);\\n            if (command == '01') {\\n                while (index < total_length + 16) {\\n                    // gen_location = '0'; //cambiado 30/09\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        //Device ID\\n                        case '01':\\n                            var imei = hexToAscii(value);\\n                            break;\\n                            //Alarm code\\n                        case '02':\\n                            var alarm = 'CYC';\\n                            var alarmCode = value.substring(0, 8);\\n                            alarmCode = changeEndianness(alarmCode);\\n                            var timestampHex = value.substring(8, 16);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            event_time = timestamp;\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\n                            var alarmCodeExt = value.substring(16, 24);\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n                            //Extended Alerts\\n                            // Fall off\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Standard Alerts\\n                            //Battery low\\n                            else if ((alarmCodeInt & 1) == 1) {\\n                                var alarm = 'BATL';\\n                            }\\n                            //Overspeed\\n                            else if ((alarmCodeInt & 2) == 2) {\\n                                var alarm = 'ALSP';\\n                            }\\n                            //Fall\\n                            else if ((alarmCodeInt & 4) == 4) {\\n                                var alarm = 'ALF';\\n                            }\\n                            //Tilt\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'Tilt';\\n                            } else if ((alarmCodeInt & 16) == 16) {\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\n                                    var alarm = 'Geo1-IN';\\n                                } else {\\n                                    var alarm = 'Geo1-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 32) == 32) {\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\n                                    var alarm = 'Geo2-IN';\\n                                } else {\\n                                    var alarm = 'Geo2-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 64) == 64) {\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\n                                    var alarm = 'Geo3-IN';\\n                                } else {\\n                                    var alarm = 'Geo3-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 128) == 128) {\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\n                                    var alarm = 'Geo4-IN';\\n                                } else {\\n                                    var alarm = 'Geo4-OUT';\\n                                }\\n                            }\\n                            //Power Off\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\n                                var alarm = 'Side2';\\n                            }\\n                            //Battery charging\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\n                                var alarm = 'BATCN';\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                            }\\n                            //SOS Ending\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'SOSEnding';\\n                                info = 'Alarm Finished';\\n                            }\\n                            //Amber Alert  EC03 only\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALAO';\\n                            }\\n                            // welfare Alert check-in ALA-O\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'ALA-O';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\n                            //    var alarm = 'ALA-C';\\n                            //}\\n                            // Fall-Down Alert ending\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // welfare Alert Ending  ALA\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\n                            //    var alarm = 'BEA';\\n                            //}\\n                            general += 'alarm:' + alarm + ',';\\n                            break;\\n                            //Custom ID\\n                        case '03':\\n                            // in value is customID.... '06' for Watch Care\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //update customID to check if belongs to this type of device\\n                            customID = value;\\n                            if (value != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                // exit decoder\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n                                // console.log(data);\\n                                return // data\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    //return;\\n                                }\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                general += 'customID:' + value + ',';\\n                                break;\\n                            }\\n                            //Historical Data Completed\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\n                            var histData = true;\\n                            break;\\n                            //GPS location\\n                        case '20':\\n                            location_type = 'GPS';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var speedHex = value.substring(16, 20);\\n                            var directionHex = value.substring(20, 24);\\n                            var altitudeHex = value.substring(24, 28);\\n                            var location_accuracyHex = value.substring(28, 32);\\n                            var mileageHex = value.substring(32, 40);\\n                            var satellitesHex = value.substring(40, 42);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            // Range: 0.5 to 99.9  \\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n                            var satellites = hexToDecimal(satellitesHex);\\n                            // location_time = timestamp;\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //WIFI Towers\\n                        case '22':\\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            wifi_data = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            wifi_data = wifi_data.slice(0, -1);\\n                            general += wifi_data;\\n                            break;\\n                            //BLE Location  Added 10/10/22\\n                        case '23':\\n                            location_type = 'BLE';\\n                            var mac = value.substring(0, 12);\\n                            var latitudeHex = value.substring(12, 20);\\n                            var longitudeHex = value.substring(20, 28);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var address = hexToAscii(value.substring(28, value.length));\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            // location_time = timestamp;\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //General Data ,  status_data\\n                        case '24':\\n                            //var general = 'true'\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            }\\n                            //else {\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n                            //}\\n                            // reset variables\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            var timestampHex = value.substring(0, 8);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            location_time = timestamp;\\n                            event_time = timestamp;\\n                            // HardCode to fix possible issue in protocol\\n                            //event_time = moment.utc().unix();\\n                            // end of hard code\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\n                            var statusInt = hexToDecimal(statusHex);\\n                            var statusDevice = '';\\n                            if ((statusInt & 1) == 1) {\\n                                statusDevice += 'GPS,';\\n                            }\\n                            if ((statusInt & 2) == 2) {\\n                                statusDevice += 'WIFISource,';\\n                            }\\n                            if ((statusInt & 4) == 4) {\\n                                statusDevice += 'CellTower,';\\n                            }\\n                            if ((statusInt & 8) == 8) {\\n                                statusDevice += 'BLELocation,';\\n                            }\\n                            //params.BatteryStatus.BatteryStatus = '1';\\n                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // var alarm = 'BATCN';\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '1';\\n                                     var alarm = 'BATCN';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            if ((statusInt & 32) == 32) {\\n                                statusDevice += 'FUllyCharged,';\\n                                //var alarm = 'BATF';\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '3';\\n                                     var alarm = 'BATF';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n                                 statusDevice += 'Not Charging,';\\n                                 var alarm = 'BATCF';\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\n                                       var batteryStatus = '2';\\n                                       var alarm = 'BATCF';\\n                                       let configsToUpdate = [];\\n                                       configsToUpdate.push({\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\n                                           'value': batteryStatus\\n                                       });\\n                                   }\\n                             }*/\\n                            if ((statusInt & 64) == 64) {\\n                                statusDevice += 'Reboot,';\\n                            }\\n                            if ((statusInt & 128) == 128) {\\n                                statusDevice += 'HistoricalData,';\\n                            }\\n                            if ((statusInt & 256) == 256) {\\n                                statusDevice += 'AGPSDataValid,';\\n                            }\\n                            if ((statusInt & 512) == 512) {\\n                                statusDevice += 'Motion,';\\n                            }\\n                            if ((statusInt & 1024) == 1024) {\\n                                statusDevice += 'SmartLocating,';\\n                            }\\n                            if ((statusInt & 2048) == 2048) { //isHome\\n                                statusDevice += 'BeaconLocation,';\\n                            }\\n                            if ((statusInt & 4096) == 4096) {\\n                                statusDevice += 'BLEConnected,';\\n                            }\\n                            if ((statusInt & 16384) == 16384) {\\n                                statusDevice += 'HomeWiFi,';\\n                            }\\n                            statusDevice = statusDevice.slice(0, -1);\\n                            status_data = statusDevice; //to oysta template\\n                            //statusHex = (statusHex);\\n                            statusHex = hexToBin(statusHex);\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\n                            general += 'statusDevice:' + statusDevice + ',';\\n                            if (battery_percentage) {\\n                                general += 'battery:' + battery_percentage + ',';\\n                            }\\n                            if (cellNetworkSignal) {\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n                            }\\n                            if (workMode) {\\n                                general += 'workMode:' + workMode + ',';\\n                            }\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n                            break;\\n                            //Call Records\\n                        case '25':\\n                            //Needed?\\n                            break;\\n                            //BLE Location 2\\n                        case '26':\\n                            //I don't understand\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Smart Location\\n                        case '27':\\n                            location_type = 'SMART';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var location_accuracyHex = value.substring(16, 20);\\n                            var altitudeHex = value.substring(20, 24);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //location_time = timestamp;\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //Beacon Location  Added 11/10/22\\n                        case '28':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                                descr = hexToAscii(value.substring(34, value.length));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            // var latitudeHex = value.substring(18, 26);\\n                            // var longitudeHex = value.substring(26, 34);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            // Beacon V2\\n                        case '2C':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(20, 28);\\n                                longitudeHex = value.substring(28, 36);\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            //Cell Towers Note\\n                        case '29':\\n                            location_type = 'LBS';\\n                            lbs_data = '';\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\n                            var mncHex = value.substring(4, 6);\\n                            var mcc = hexToDecimal(mccHex);\\n                            lbs_data += mcc + ',';\\n                            var mnc = hexToDecimal(mncHex);\\n                            lbs_data += mnc + ',';\\n                            var indexLbs = 6;\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n                            for (let i = 0; i < numTowers; i++) {\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n                                var rxl = hexToDecimal(rxlHex);\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n                                var lac = hexToDecimal(lacHex);\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n                                indexLbs += 14;\\n                            }\\n                            lbs_data = lbs_data.slice(0, -1);\\n                            general += lbs_data;\\n                            break;\\n                        case '30':\\n                            //G-sensor. \\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numStep = (keyLength - 2) / 16;\\n                            for (let j = 0; j < numStep; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var stepHex = value.substring(8, 16);\\n                                stepHex = changeEndianness(stepHex);\\n                                var stepRate = hexToDecimal(stepHex);\\n                                info = stepRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'STP';\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //Activity\\n                        case '31':\\n                            //I don't understand\\n                            break;\\n                            //BLE MAC list\\n                        case '32':\\n                            //I don't understand\\n                            break;\\n                            //Beacon List\\n                        case '33':\\n                            //I don't understand\\n                            break;\\n                            //Heart Rate Data\\n                        case '40':\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numHeartRate = (keyLength - 2) / 12;\\n                            for (let j = 0; j < numHeartRate; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var heartRateHex = value.substring(8, 10);\\n                                var heartRate = hexToDecimal(heartRateHex);\\n                                var trustLevelHex = value.substring(10, 12);\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\n                                info = heartRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'HRT';\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //BLE Connected  . For Flic button\\n                        case '62':\\n                            location_type = 'BLE';\\n                            //var alarm = 'EBZI'; \\n                            //var latitudeHex = '00';\\n                            //var longitudeHex = '00';\\n                            //var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n                            //location_time = timestamp;\\n                            ble_data = `${flag},${batLevel},${mac}`;\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n                            break;\\n                    }\\n                }\\n                if (alarmCode) {\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                } else if (statusDevice) {\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                /*else if (alarm === 'HRT') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else if (alarm === 'STP') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else {\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           }*/\\n                // rest the alarm value\\n                alarm = '';\\n            }\\n            if (command == '02') {\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    switch (key) {\\n                        //Module Number\\n                        case '01':\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Firmware version\\n                        case '02':\\n                            //no ACK need\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1A':\\n                            //no ACK need\\n                            var fwVersion = hexToAscii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            break;\\n                            //IMEI\\n                        case '03':\\n                            var imei = hexToDecimal(value);\\n                            // harcode to avoid conflicts with Rio protocol\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\n                            //    return\\n                            //}\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //ICCID\\n                        case '04':\\n                            var iccid = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //BLE-MAC\\n                        case '05':\\n                            var bleMac = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Run Time\\n                        case '07':\\n                            var runTime = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '10': // Ringer Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\n                            break;\\n                        case '0A': //Performance  mode\\n                            //var workMode = hexToDecimal(value);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            break;\\n                        case '1B':\\n                            //Decimal o ascii?\\n                            var gsmModule = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1F':\\n                            //System Language\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n                            break;\\n                        case '33': // phone option\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n                                var auto = 'true';\\n                            } else var auto = 'false';\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                allow = 'true';\\n                            } else var allow = 'false';\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            break;\\n                        case '30': //ContactList\\n                            var contactNumber = value.substring(1, 2);\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\n                            var tel = '';\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                case '0':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n                                    break;\\n                                    // Gateway Number\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n                                        tel = 'Esendex UK'\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n                                        tel = 'Esendex Spain'\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n                                        tel = 'Esendex UK Acceptance'\\n                                    } else {\\n                                        tel = 'Default'\\n                                    }\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                                    break;\\n                                default:\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) {\\n                                        contacts += '';\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                        break;\\n                                    }\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n                                    contacts += tel + ', ';\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                    break;\\n                            }\\n                            break;\\n                        case '40': // APN\\n                            //no ACK need\\n                            var apn = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                            break;\\n                        case '43': //Server Details\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\n                                serverDetails = 'Production'\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\n                                serverDetails = 'Acceptance'\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\n                                serverDetails = 'Protocol-Import'\\n                            } else {\\n                                serverDetails = 'Default'\\n                            }\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                            break;\\n                        case '44': //time interval - work mode intervals\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            var workMode = 0;\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\n                                //workMode = 'High Frequency';\\n                                workMode = 3;\\n                            }\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\n                                //workMode = 'Balanced';\\n                                workMode = 2;\\n                            }\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\n                                //workMode = 'Power Saving';\\n                                workMode = 1;\\n                            }\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\n                                //workMode = 'No Reporting';\\n                                workMode = 0;\\n                            }\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '47': // Custom Id\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\n                            configsToAck.push(configIds.ReadState.CustomId);\\n                            break;\\n                        case '53': // Non motion alert\\n                            //2B020080\\n                            var status = hexToBin(value.substring(6, 8));\\n                            var alertSetting = '';\\n                            var enableDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enableDisable = '1';\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                            };\\n                            //if (status.substring(5, 6) == '1') {\\n                            //    alertSetting += 'Dial, '\\n                            //} else {\\n                            //    alertSetting += 'No Dial, '\\n                            //};\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\n                            var enalbleDisable = '';\\n                            //if (fallStatus.substring(4, 5) == '1') {\\n                            if (fallStatus.substring(0, 1) == '1') {\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                var sensibility = 'Disable, '\\n                            };\\n                            if (fallStatus.substring(5, 6) == '1') {\\n                                sensibility += 'Dial, '\\n                            } else {\\n                                sensibility += 'No Dial, '\\n                            };\\n                            var imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n                            sensibility += sesibityOptionValue;\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n                            homeBeacon += beaconStatus + ', ';\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '4A': //Wifi Network List\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n                            var wifiStatus = value.substring(0, 1);\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n                            /var homeWifi = '';\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\n                                if (wifiStatus == '8') {\\n                                    homeWifi += ' Enable, '\\n                                    enalbleDisable = '1';\\n                                } else {\\n                                    homeWifi += ' Disable, '\\n                                    //enalbleDisable = '0';\\n                                };*/\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                            }\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n                            break;\\n                        case '21': // Speed Dial Settings\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '03') {\\n                while (index < total_length + 16) {\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        case '01': // Device ID\\n                            var imei = hexToAscii(value);\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            break;\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /* case '03':\\n                                //update customID to check if belongs to this type of device\\n                                customID = value;\\n                                if (value != '04') {\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    return\\n                                } else {\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    }\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    general += 'customID:' + value + ',';\\n                                    break;\\n                                }\\n                                break; */\\n                        case '10': // Heartbeat\\n                            var heartbeat = hexToAscii(value);\\n                            event_time = moment.utc().unix();\\n                            if (index < total_length + 16) {\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\n                                key = message.substring(index, index = index + 2);\\n                                if (key == '24') {\\n                                    //     debug('key: ' + key) //comment those out\\n                                    value = message.substring(index, index = index + keyLength - 2);\\n                                    //    debug(value)\\n                                    var timestampHex = value.substring(0, 8);\\n                                    //    debug('timestampt hex: ' + timestampHex)\\n                                    timestampHex = changeEndianness(timestampHex);\\n                                    timestamp = hexToDecimal(timestampHex);\\n                                    event_time = timestamp;\\n                                    //    debug(event_time)\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\n                                    //    debug(statusHex)\\n                                    var statusInt = hexToDecimal(statusHex);\\n                                    var statusDevice = '';\\n                                    if ((statusInt & 1) == 1) {\\n                                        statusDevice += 'GPS,';\\n                                    }\\n                                    if ((statusInt & 2) == 2) {\\n                                        statusDevice += 'WIFISource,';\\n                                    }\\n                                    if ((statusInt & 4) == 4) {\\n                                        statusDevice += 'CellTower,';\\n                                    }\\n                                    if ((statusInt & 8) == 8) {\\n                                        statusDevice += 'BLELocation,';\\n                                    }\\n                                    if ((statusInt & 16) == 16) {\\n                                        statusDevice += 'Charging,';\\n                                    }\\n                                    if ((statusInt & 32) == 32) {\\n                                        statusDevice += 'FUllyCharged,';\\n                                    }\\n                                    if ((statusInt & 64) == 64) {\\n                                        statusDevice += 'Reboot,';\\n                                    }\\n                                    if ((statusInt & 128) == 128) {\\n                                        statusDevice += 'HistoricalData,';\\n                                    }\\n                                    if ((statusInt & 256) == 256) {\\n                                        statusDevice += 'AGPSDataValid,';\\n                                    }\\n                                    if ((statusInt & 512) == 512) {\\n                                        statusDevice += 'Motion,';\\n                                    }\\n                                    if ((statusInt & 1024) == 1024) {\\n                                        statusDevice += 'SmartLocating,';\\n                                    }\\n                                    if ((statusInt & 2048) == 2048) {\\n                                        statusDevice += 'BeaconLocation,';\\n                                    }\\n                                    if ((statusInt & 4096) == 4096) {\\n                                        statusDevice += 'BLEConnected,';\\n                                    }\\n                                    statusDevice = statusDevice.slice(0, -1);\\n                                    //   debug('statusHex:' + statusHex)\\n                                    statusHex = (statusHex);\\n                                    statusHex = hexToBin(statusHex);\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                                    //    debug(statusHex)\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                                    //    debug(battery_percentage)\\n                                    //    debug(battery_percentage)\\n                                    //    debug(statusHex.substring(8, 13))\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                                    //    debug(cellNetworkSignal)\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\n                                    //    debug(workMode)\\n                                    general += 'statusDevice:' + statusDevice + ';';\\n                                    if (battery_percentage) {\\n                                        general += 'battery:' + battery_percentage + ';';\\n                                    }\\n                                    if (cellNetworkSignal) {\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n                                    }\\n                                    if (workMode) {\\n                                        general += 'workMode:' + workMode + ';';\\n                                    }\\n                                }\\n                            }\\n                            // revisar\\n                            var gen_location = '0';\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '12': // Device requesting timestamp\\n                            timestamp = moment.utc().unix();\\n                            timestampHex = decimalToHex(timestamp);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n                            // respond to device with the timestamp of the server\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '21': //Cell Towers\\n                            var mccHex = value.substring(0, 2);\\n                            var mncHex = value.substring(2, 3);\\n                            var mcc = hexToDecimal(mccHex);\\n                            var mnc = hexToDecimal(mncHex);\\n                            var numTowers = (keyLength - 4) / 5;\\n                            var cellTowers = hexToAscii(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '22': // WIFI locations \\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            gen_location = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            gen_location = gen_location.slice(0, -1);\\n                            general += gen_location;\\n                            //CustomID is not provided so far with command type 03\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            alarmCode = '';\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '04') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7E') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7F') {\\n                // while (index < total_length + 16) {\\n                var keyLength = message.substring(index, index = index + 2);\\n                keyLength = 2 * hexToDecimal(keyLength);\\n                var key = message.substring(index, index = index + 2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                var value = message.substring(index, index = index + keyLength - 2);\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n                //}\\n            }\\n            if (command == 'FE') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            // prepare the ACK msg and change config if it is needed\\n            lengthAck = messageBody.length / 2;\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n            ////////////checksum CRC 16\\n            var checksumAck = byteStringToByteArray(messageBody);\\n            checksumAck = crc16byte(checksumAck);\\n            checksumAck = decimalToHex(checksumAck);\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\n            // To send ACK to the device previous to internal msg with parts\\n            if (needsAck == true) {\\n                if (messageBody.length <= 2) {\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n                } else {\\n                    ack = prefix + messageBody;\\n                }\\n                AddValue(codeValues, 'imei', imei);\\n                AddValue(codeValues, 'ack', ack);\\n            }\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n            if (i >= 0) {\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n    // Auxiliary functions\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n        const dataToReceiver = {\\n            values: codeValues\\n        };\\n        if (configsToAck.length > 0) {\\n            dataToReceiver.configsToAck = configsToAck;\\n        }\\n        if (configsToUpdate.length > 0) {\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\n        }\\n        if (configsToSend.length > 0) {\\n            dataToReceiver.configsToSend = configsToSend;\\n        }\\n        return dataToReceiver;\\n    }\\n\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        var cvpair = {\\n            code: p1,\\n            value: p2\\n        };\\n        codeValueArray.push(cvpair);\\n    }\\n    // convert functions\\n    function asciiToHex(str) { // ascii to hex \\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n    }\\n\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n        const bytes = [];\\n        for (let i = 0; i < str.length; i += 2) {\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n                bytes.push(byte);\\n            }\\n        }\\n        return bytes;\\n    }\\n\\n    function decimalToHex(x) {\\n        return Number(x).toString(16).toUpperCase();\\n    }\\n\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n        const bin = parseInt(hex, 16).toString(2);\\n        return bin.padStart(hex.length * 4, '0');\\n    }\\n\\n    function hexToAscii(hex) {\\n        if (hex.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 !== 0) {\\n            hex = '0' + hex;\\n        }\\n        const num = parseInt(hex, 16);\\n        const bits = hex.length * 4;\\n        const maxVal = 2 ** bits;\\n        return num >= maxVal / 2 ? num - maxVal : num;\\n    }\\n\\n    function hexToDecimal(hex) {\\n        return parseInt(hex, 16);\\n    }\\n    // CheckSum and debug functions\\n    function changeEndianness(hexString) { // changeEndianness\\n        if (hexString.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hexString.match(/.{2}/g) // divide en bytes (2 caracteres)\\n            .reverse() // invierte el orden\\n            .join('');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n        const bytes = byteStringToByteArray(payloadData);\\n        const crc = crc16byte(bytes);\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n        return changeEndianness(hex);\\n    }\\n\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n        let crc = 0x0000;\\n        for (const byte of byteArray) {\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\n            }\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\n            crc = crcTable[index] ^ (crc << 8);\\n        }\\n        return crc & 0xFFFF;\\n    }\\n\\n    function debug(...args) { // write debug info to console log, if localTesting\\n        if (localTesting) {\\n            console.debug('[DEBUG]', ...args);\\n        }\\n    }\\n    /*\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n        var server;\\n        if (localTesting) {\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5878, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5878, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }*/\\n    function sendMessageToLocalhostNoWait(message) {\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\n        const port = '5678'; //acceptance-dev\\n        if (localTesting) {\\n            console.debug('[DEBUG] Sending message to test server:', message);\\n        }\\n        const client = net.createConnection(port, server, () => {\\n            client.write(message);\\n            client.end();\\n        });\\n        client.on('error', (err) => {\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n        });\\n        client.on('end', () => {\\n            if (localTesting) {\\n                console.debug('[DEBUG] Connection closed');\\n            }\\n        });\\n    }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n    module.exports = {\\n        execute_ops\\n    }\\n} else { // on server use local defined vars\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n    // define global returns\\n    msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744388039},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n    ///////////////////////////////////////////////////////////////////////////////\\n    //\\n    // Roam protocol - please see variables and typical values in order below\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n    //\\n    // Author: Juanmi Navarro\\n    // Created: 01/01/0000\\n    // Last modified: 11/04/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        let localTesting = \\\"False\\\";\\n    }\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n    ];\\n    var codeValues = [];\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\n    var dataToReceiver = [];\\n    var configsToAck = [];\\n    var configsToUpdate = [];\\n    var configsToSend = [];\\n    if (globalTemplate == \\\"True\\\") {\\n        if (raw.startsWith('esendex')) {\\n            AddValue(codeValues, 'rawMsg', raw);\\n            //general SMS message\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\n            return;\\n        }\\n        AddValue(codeValues, 'raw', raw);\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\n        var homeBeacon = '';\\n        var homeWiFi = '';\\n        var contacts = '';\\n        var gps_data = '';\\n        var wifi_data = '';\\n        var status_data = '';\\n        var lbs_data = '';\\n        var beacon_data = '';\\n        var ble_data = '';\\n        var smart_data = '';\\n        //parse header & properties\\n        var message = rawFromBytes;\\n        var properties = message.substring(2, 4);\\n        var lengthLittleEndian = message.substring(4, 8);\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\n        var messageForReceiver;\\n        var sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        var index = 18;\\n        var prefix = 'AB' + '00';\\n        var lengthAck = 0;\\n        var ack = '';\\n        var needsAck = false;\\n        var hasConfigs = false;\\n        var general = '';\\n        var timestamp = '';\\n        var info = '';\\n        var customID = '';\\n        latitude = 0;\\n        longitude = 0;\\n        location_accuracy = 0; // GPS location adds the accuracy\\n        location_time = event_time = '';\\n        speed = 0.0;\\n        var location_type = '0';\\n        //var gen_location = '0'; \\n        var i; // general loop counter\\n        var battery_percentage = '';\\n        var cellNetworkSignal = '';\\n        var workMode = '';\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\n            needsAck = true;\\n        }\\n        // Loop to decode multi-ACK msg\\n        if (message.includes('AB00030008C7')) {\\n            const multiack = message.split('AB00');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB00' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            } // FOR multiACK\\n        } else decoder(message); // IF multiACK\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\n        AddValue(codeValues, 'rawMsg', raw);\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\n            var gen_location = params.gps_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var location_accuracy = gen_location[2];\\n            var speed = gen_location[3];\\n            var direction = gen_location[4];\\n            var altitude = gen_location[5];\\n            var satellites = gen_location[6];\\n            var mileage = gen_location[7];\\n            if (location_accuracy !== 0) {\\n                var fix_state = 1;\\n            } else {\\n                var fix_state = 0;\\n            }\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            AddValue(codeValues, 'speed', speed);\\n            AddValue(codeValues, 'direction', direction);\\n            AddValue(codeValues, 'altitude', altitude);\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\n            AddValue(codeValues, 'mileage', mileage);\\n            AddValue(codeValues, 'satellites', satellites);\\n            AddValue(codeValues, 'fix_state', fix_state);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\n            var variables = []; //Define array\\n            variables = params.lbs_data.split(',');\\n            var index = 2;\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\n                    AddValue(codeValues, 'mcc', variables[0]);\\n                    AddValue(codeValues, 'mnc', variables[1]);\\n                    AddValue(codeValues, 'lac', variables[index]);\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\n                }\\n                index += 3;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\n            var bssid_array = params.wifi_data.split(',');\\n            var index = 0;\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\n                }\\n                index += 2;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        //  when Beacon is detected and it isn't flic BLE detected\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\n            var gen_location = params.beacon_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var mac = gen_location[2];\\n            var label = gen_location[3];\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac) {\\n                AddValue(codeValues, 'beacon_mac', mac);\\n                var simpleQuery = [{\\n                    'code': 'Mac',\\n                    'value': mac,\\n                }];\\n                var simpleQueryLabel = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery\\n                };\\n                var labels = [];\\n                labels.push(JSON.stringify(simpleQueryLabel));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\n            var gen_location = params.ble_data.split(',');\\n            var flag = gen_location[0];\\n            var batLevel = gen_location[1];\\n            var mac2 = gen_location[2];\\n            //var label = gen_location[3];\\n            AddValue(codeValues, 'flagBLE', flag);\\n            AddValue(codeValues, 'batBLE', batLevel);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac2) {\\n                AddValue(codeValues, 'beacon_mac', mac2);\\n                var simpleQuery2 = [{\\n                    'code': 'Mac',\\n                    'value': mac2,\\n                }];\\n                var simpleQueryLabel2 = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery2\\n                };\\n                var labels2 = [];\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        /*  meter mas tarde...   \\n            if (params.smart_data !== 'undefined') {\\n                var gen_location = params.smart_data.split(',')\\n                var latitude = gen_location[0]\\n                var longitude = gen_location[1]\\n                var location_accuracy = gen_location[2]\\n                var altitude = gen_location[3]\\n                AddValue(codeValues,'latitude', latitude);\\n                AddValue(codeValues,'longitude', longitude);\\n                AddValue(codeValues,'altitude', altitude);\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\n            }\\n          */\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues,'event_time', event_time);\\n        }  revisar mas adelante*/\\n        // to parse SMS info from the device\\n        switch (messageTypeLocalCode) {\\n            case 'COMM-SMS': // SMS message sent in\\n                if (params.data.startsWith('Device location request')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('IMEI:')) {\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n                } else if (params.data.startsWith('flush ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('Set Roam-')) {\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\n                } else if (params.data.startsWith('set live tracking')) {\\n                    configsToAck.push(configIds.Controls.Trace);\\n                } else if (params.data.startsWith('reboot ok')) {\\n                    configsToAck.push(configIds.Controls.Reboot);\\n                } else if (params.data.startsWith('GPS')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                    var i1 = params.data.search('Now:')\\n                    var i2 = params.data.search('Loc Time:')\\n                    var i3 = params.data.search('Speed:')\\n                    var i4 = params.data.search('Altitude:')\\n                    var i5 = params.data.search('Battery:')\\n                    var i6 = params.data.search('google')\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                        Speed = Speed * 0.44704\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                        Speed = Speed / 3.6\\n                    }\\n                    var latlong = params.data.substring(i6 + 18)\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                break;\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\n                //var i1 = params.data.search('IMEI:')\\n                //var i2 = params.data.search('GSM signal quality:')\\n                var i3 = params.data.search('Software version:')\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\n                var i4 = sub.search('version:');\\n                var fwVersion = sub.substring(i4, sub.length);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                break;\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\n                var i1 = params.data.search('Fall alarm:');\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\n                var i2 = params.data.search('level:');\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\n                break;\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\n                var i1 = raw.search('1,');\\n                //var i2 = params.data.search('2,');\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                break;\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = raw.search('A1:');\\n                if (raw.includes('A2:')) {\\n                    var i2 = raw.search('A2:');\\n                } else {\\n                    var i2 = raw.search('A10:');\\n                }\\n                var tel = raw.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                i2 = raw.search('A10:')\\n                tel = raw.substring(i2 + 4, raw.length);\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                break;\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = params.data.search('APN:')\\n                var i2 = params.data.search('IP:')\\n                var i3 = params.data.search('Move')\\n                var apn = params.data.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"apn\\\", apn);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\n                var i3 = params.data.search('Speed:')\\n                var i4 = params.data.search('Altitude:')\\n                var i5 = params.data.search('Battery:')\\n                var i6 = params.data.search('google')\\n                var eventTime = params.data.substring(0, i3)\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                    Speed = Speed * 0.44704\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                    Speed = Speed / 3.6\\n                }\\n                var latlong = params.data.substring(i6 + 18)\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n        }\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues, 'event_time', event_time);\\n        }\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n        //    var location_time = moment.utc().unix();\\n        //    AddValue(codeValues, 'location_time', location_time);\\n        //}\\n    }\\n    // send data msg to kibana\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n    console.log(data);\\n    return data\\n    // end of main operation\\n    // define functions used in operation\\n    // decode global msg\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\n        var checksum = message.substring(8, 12);\\n        var messageBody = message.substring(16, message.length);\\n        debug('message =' + message);\\n        debug('checksum =' + checksum);\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n            debug(\\\"message has valid checksum\\\");\\n            var messageBody = command; // update value for the ACK\\n            debug('command =' + command);\\n            if (command == '01') {\\n                while (index < total_length + 16) {\\n                    // gen_location = '0'; //cambiado 30/09\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        //Device ID\\n                        case '01':\\n                            var imei = hexToAscii(value);\\n                            break;\\n                            //Alarm code\\n                        case '02':\\n                            var alarm = 'CYC';\\n                            var alarmCode = value.substring(0, 8);\\n                            alarmCode = changeEndianness(alarmCode);\\n                            var timestampHex = value.substring(8, 16);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            event_time = timestamp;\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\n                            var alarmCodeExt = value.substring(16, 24);\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n                            //Extended Alerts\\n                            // Fall off\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Standard Alerts\\n                            //Battery low\\n                            else if ((alarmCodeInt & 1) == 1) {\\n                                var alarm = 'BATL';\\n                            }\\n                            //Overspeed\\n                            else if ((alarmCodeInt & 2) == 2) {\\n                                var alarm = 'ALSP';\\n                            }\\n                            //Fall\\n                            else if ((alarmCodeInt & 4) == 4) {\\n                                var alarm = 'ALF';\\n                            }\\n                            //Tilt\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'Tilt';\\n                            } else if ((alarmCodeInt & 16) == 16) {\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\n                                    var alarm = 'Geo1-IN';\\n                                } else {\\n                                    var alarm = 'Geo1-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 32) == 32) {\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\n                                    var alarm = 'Geo2-IN';\\n                                } else {\\n                                    var alarm = 'Geo2-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 64) == 64) {\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\n                                    var alarm = 'Geo3-IN';\\n                                } else {\\n                                    var alarm = 'Geo3-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 128) == 128) {\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\n                                    var alarm = 'Geo4-IN';\\n                                } else {\\n                                    var alarm = 'Geo4-OUT';\\n                                }\\n                            }\\n                            //Power Off\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\n                                var alarm = 'Side2';\\n                            }\\n                            //Battery charging\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\n                                var alarm = 'BATCN';\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                            }\\n                            //SOS Ending\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'SOSEnding';\\n                                info = 'Alarm Finished';\\n                            }\\n                            //Amber Alert  EC03 only\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALAO';\\n                            }\\n                            // welfare Alert check-in ALA-O\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'ALA-O';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\n                            //    var alarm = 'ALA-C';\\n                            //}\\n                            // Fall-Down Alert ending\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // welfare Alert Ending  ALA\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\n                            //    var alarm = 'BEA';\\n                            //}\\n                            general += 'alarm:' + alarm + ',';\\n                            break;\\n                            //Custom ID\\n                        case '03':\\n                            // in value is customID.... '06' for Watch Care\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //update customID to check if belongs to this type of device\\n                            customID = value;\\n                            if (value != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                // exit decoder\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n                                // console.log(data);\\n                                return // data\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    //return;\\n                                }\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                general += 'customID:' + value + ',';\\n                                break;\\n                            }\\n                            //Historical Data Completed\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\n                            var histData = true;\\n                            break;\\n                            //GPS location\\n                        case '20':\\n                            location_type = 'GPS';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var speedHex = value.substring(16, 20);\\n                            var directionHex = value.substring(20, 24);\\n                            var altitudeHex = value.substring(24, 28);\\n                            var location_accuracyHex = value.substring(28, 32);\\n                            var mileageHex = value.substring(32, 40);\\n                            var satellitesHex = value.substring(40, 42);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            // Range: 0.5 to 99.9  \\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n                            var satellites = hexToDecimal(satellitesHex);\\n                            // location_time = timestamp;\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //WIFI Towers\\n                        case '22':\\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            wifi_data = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            wifi_data = wifi_data.slice(0, -1);\\n                            general += wifi_data;\\n                            break;\\n                            //BLE Location  Added 10/10/22\\n                        case '23':\\n                            location_type = 'BLE';\\n                            var mac = value.substring(0, 12);\\n                            var latitudeHex = value.substring(12, 20);\\n                            var longitudeHex = value.substring(20, 28);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var address = hexToAscii(value.substring(28, value.length));\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            // location_time = timestamp;\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //General Data ,  status_data\\n                        case '24':\\n                            //var general = 'true'\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            }\\n                            //else {\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n                            //}\\n                            // reset variables\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            var timestampHex = value.substring(0, 8);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            location_time = timestamp;\\n                            event_time = timestamp;\\n                            // HardCode to fix possible issue in protocol\\n                            //event_time = moment.utc().unix();\\n                            // end of hard code\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\n                            var statusInt = hexToDecimal(statusHex);\\n                            var statusDevice = '';\\n                            if ((statusInt & 1) == 1) {\\n                                statusDevice += 'GPS,';\\n                            }\\n                            if ((statusInt & 2) == 2) {\\n                                statusDevice += 'WIFISource,';\\n                            }\\n                            if ((statusInt & 4) == 4) {\\n                                statusDevice += 'CellTower,';\\n                            }\\n                            if ((statusInt & 8) == 8) {\\n                                statusDevice += 'BLELocation,';\\n                            }\\n                            //params.BatteryStatus.BatteryStatus = '1';\\n                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // var alarm = 'BATCN';\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '1';\\n                                     var alarm = 'BATCN';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            if ((statusInt & 32) == 32) {\\n                                statusDevice += 'FUllyCharged,';\\n                                //var alarm = 'BATF';\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '3';\\n                                     var alarm = 'BATF';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n                                 statusDevice += 'Not Charging,';\\n                                 var alarm = 'BATCF';\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\n                                       var batteryStatus = '2';\\n                                       var alarm = 'BATCF';\\n                                       let configsToUpdate = [];\\n                                       configsToUpdate.push({\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\n                                           'value': batteryStatus\\n                                       });\\n                                   }\\n                             }*/\\n                            if ((statusInt & 64) == 64) {\\n                                statusDevice += 'Reboot,';\\n                            }\\n                            if ((statusInt & 128) == 128) {\\n                                statusDevice += 'HistoricalData,';\\n                            }\\n                            if ((statusInt & 256) == 256) {\\n                                statusDevice += 'AGPSDataValid,';\\n                            }\\n                            if ((statusInt & 512) == 512) {\\n                                statusDevice += 'Motion,';\\n                            }\\n                            if ((statusInt & 1024) == 1024) {\\n                                statusDevice += 'SmartLocating,';\\n                            }\\n                            if ((statusInt & 2048) == 2048) { //isHome\\n                                statusDevice += 'BeaconLocation,';\\n                            }\\n                            if ((statusInt & 4096) == 4096) {\\n                                statusDevice += 'BLEConnected,';\\n                            }\\n                            if ((statusInt & 16384) == 16384) {\\n                                statusDevice += 'HomeWiFi,';\\n                            }\\n                            statusDevice = statusDevice.slice(0, -1);\\n                            status_data = statusDevice; //to oysta template\\n                            //statusHex = (statusHex);\\n                            statusHex = hexToBin(statusHex);\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\n                            general += 'statusDevice:' + statusDevice + ',';\\n                            if (battery_percentage) {\\n                                general += 'battery:' + battery_percentage + ',';\\n                            }\\n                            if (cellNetworkSignal) {\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n                            }\\n                            if (workMode) {\\n                                general += 'workMode:' + workMode + ',';\\n                            }\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n                            break;\\n                            //Call Records\\n                        case '25':\\n                            //Needed?\\n                            break;\\n                            //BLE Location 2\\n                        case '26':\\n                            //I don't understand\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Smart Location\\n                        case '27':\\n                            location_type = 'SMART';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var location_accuracyHex = value.substring(16, 20);\\n                            var altitudeHex = value.substring(20, 24);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //location_time = timestamp;\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //Beacon Location  Added 11/10/22\\n                        case '28':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                                descr = hexToAscii(value.substring(34, value.length));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            // var latitudeHex = value.substring(18, 26);\\n                            // var longitudeHex = value.substring(26, 34);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            // Beacon V2\\n                        case '2C':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(20, 28);\\n                                longitudeHex = value.substring(28, 36);\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            //Cell Towers Note\\n                        case '29':\\n                            location_type = 'LBS';\\n                            lbs_data = '';\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\n                            var mncHex = value.substring(4, 6);\\n                            var mcc = hexToDecimal(mccHex);\\n                            lbs_data += mcc + ',';\\n                            var mnc = hexToDecimal(mncHex);\\n                            lbs_data += mnc + ',';\\n                            var indexLbs = 6;\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n                            for (let i = 0; i < numTowers; i++) {\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n                                var rxl = hexToDecimal(rxlHex);\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n                                var lac = hexToDecimal(lacHex);\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n                                indexLbs += 14;\\n                            }\\n                            lbs_data = lbs_data.slice(0, -1);\\n                            general += lbs_data;\\n                            break;\\n                        case '30':\\n                            //G-sensor. \\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numStep = (keyLength - 2) / 16;\\n                            for (let j = 0; j < numStep; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var stepHex = value.substring(8, 16);\\n                                stepHex = changeEndianness(stepHex);\\n                                var stepRate = hexToDecimal(stepHex);\\n                                info = stepRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'STP';\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //Activity\\n                        case '31':\\n                            //I don't understand\\n                            break;\\n                            //BLE MAC list\\n                        case '32':\\n                            //I don't understand\\n                            break;\\n                            //Beacon List\\n                        case '33':\\n                            //I don't understand\\n                            break;\\n                            //Heart Rate Data\\n                        case '40':\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numHeartRate = (keyLength - 2) / 12;\\n                            for (let j = 0; j < numHeartRate; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var heartRateHex = value.substring(8, 10);\\n                                var heartRate = hexToDecimal(heartRateHex);\\n                                var trustLevelHex = value.substring(10, 12);\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\n                                info = heartRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'HRT';\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //BLE Connected  . For Flic button\\n                        case '62':\\n                            location_type = 'BLE';\\n                            //var alarm = 'EBZI'; \\n                            //var latitudeHex = '00';\\n                            //var longitudeHex = '00';\\n                            //var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n                            //location_time = timestamp;\\n                            ble_data = `${flag},${batLevel},${mac}`;\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n                            break;\\n                    }\\n                }\\n                if (alarmCode) {\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                } else if (statusDevice) {\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                /*else if (alarm === 'HRT') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else if (alarm === 'STP') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else {\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           }*/\\n                // rest the alarm value\\n                alarm = '';\\n            }\\n            if (command == '02') {\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    switch (key) {\\n                        //Module Number\\n                        case '01':\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Firmware version\\n                        case '02':\\n                            //no ACK need\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1A':\\n                            //no ACK need\\n                            var fwVersion = hexToAscii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            break;\\n                            //IMEI\\n                        case '03':\\n                            var imei = hexToDecimal(value);\\n                            // harcode to avoid conflicts with Rio protocol\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\n                            //    return\\n                            //}\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //ICCID\\n                        case '04':\\n                            var iccid = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //BLE-MAC\\n                        case '05':\\n                            var bleMac = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Run Time\\n                        case '07':\\n                            var runTime = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '10': // Ringer Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\n                            break;\\n                        case '0A': //Performance  mode\\n                            //var workMode = hexToDecimal(value);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            break;\\n                        case '1B':\\n                            //Decimal o ascii?\\n                            var gsmModule = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1F':\\n                            //System Language\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n                            break;\\n                        case '33': // phone option\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n                                var auto = 'true';\\n                            } else var auto = 'false';\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                allow = 'true';\\n                            } else var allow = 'false';\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            break;\\n                        case '30': //ContactList\\n                            var contactNumber = value.substring(1, 2);\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\n                            var tel = '';\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                case '0':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n                                    break;\\n                                    // Gateway Number\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n                                        tel = 'Esendex UK'\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n                                        tel = 'Esendex Spain'\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n                                        tel = 'Esendex UK Acceptance'\\n                                    } else {\\n                                        tel = 'Default'\\n                                    }\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                                    break;\\n                                default:\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) {\\n                                        contacts += '';\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                        break;\\n                                    }\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n                                    contacts += tel + ', ';\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                    break;\\n                            }\\n                            break;\\n                        case '40': // APN\\n                            //no ACK need\\n                            var apn = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                            break;\\n                        case '43': //Server Details\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\n                                serverDetails = 'Production'\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\n                                serverDetails = 'Acceptance'\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\n                                serverDetails = 'Protocol-Import'\\n                            } else {\\n                                serverDetails = 'Default'\\n                            }\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                            break;\\n                        case '44': //time interval - work mode intervals\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            var workMode = 0;\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\n                                //workMode = 'High Frequency';\\n                                workMode = 3;\\n                            }\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\n                                //workMode = 'Balanced';\\n                                workMode = 2;\\n                            }\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\n                                //workMode = 'Power Saving';\\n                                workMode = 1;\\n                            }\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\n                                //workMode = 'No Reporting';\\n                                workMode = 0;\\n                            }\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '47': // Custom Id\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\n                            configsToAck.push(configIds.ReadState.CustomId);\\n                            break;\\n                        case '53': // Non motion alert\\n                            //2B020080\\n                            var status = hexToBin(value.substring(6, 8));\\n                            var alertSetting = '';\\n                            var enableDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enableDisable = '1';\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                            };\\n                            //if (status.substring(5, 6) == '1') {\\n                            //    alertSetting += 'Dial, '\\n                            //} else {\\n                            //    alertSetting += 'No Dial, '\\n                            //};\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\n                            var enalbleDisable = '';\\n                            //if (fallStatus.substring(4, 5) == '1') {\\n                            if (fallStatus.substring(0, 1) == '1') {\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                var sensibility = 'Disable, '\\n                            };\\n                            if (fallStatus.substring(5, 6) == '1') {\\n                                sensibility += 'Dial, '\\n                            } else {\\n                                sensibility += 'No Dial, '\\n                            };\\n                            var imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n                            sensibility += sesibityOptionValue;\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n                            homeBeacon += beaconStatus + ', ';\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '4A': //Wifi Network List\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n                            var wifiStatus = value.substring(0, 1);\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n                            /var homeWifi = '';\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\n                                if (wifiStatus == '8') {\\n                                    homeWifi += ' Enable, '\\n                                    enalbleDisable = '1';\\n                                } else {\\n                                    homeWifi += ' Disable, '\\n                                    //enalbleDisable = '0';\\n                                };*/\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                            }\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n                            break;\\n                        case '21': // Speed Dial Settings\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '03') {\\n                while (index < total_length + 16) {\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        case '01': // Device ID\\n                            var imei = hexToAscii(value);\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            break;\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /* case '03':\\n                                //update customID to check if belongs to this type of device\\n                                customID = value;\\n                                if (value != '04') {\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    return\\n                                } else {\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    }\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    general += 'customID:' + value + ',';\\n                                    break;\\n                                }\\n                                break; */\\n                        case '10': // Heartbeat\\n                            var heartbeat = hexToAscii(value);\\n                            event_time = moment.utc().unix();\\n                            if (index < total_length + 16) {\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\n                                key = message.substring(index, index = index + 2);\\n                                if (key == '24') {\\n                                    //     debug('key: ' + key) //comment those out\\n                                    value = message.substring(index, index = index + keyLength - 2);\\n                                    //    debug(value)\\n                                    var timestampHex = value.substring(0, 8);\\n                                    //    debug('timestampt hex: ' + timestampHex)\\n                                    timestampHex = changeEndianness(timestampHex);\\n                                    timestamp = hexToDecimal(timestampHex);\\n                                    event_time = timestamp;\\n                                    //    debug(event_time)\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\n                                    //    debug(statusHex)\\n                                    var statusInt = hexToDecimal(statusHex);\\n                                    var statusDevice = '';\\n                                    if ((statusInt & 1) == 1) {\\n                                        statusDevice += 'GPS,';\\n                                    }\\n                                    if ((statusInt & 2) == 2) {\\n                                        statusDevice += 'WIFISource,';\\n                                    }\\n                                    if ((statusInt & 4) == 4) {\\n                                        statusDevice += 'CellTower,';\\n                                    }\\n                                    if ((statusInt & 8) == 8) {\\n                                        statusDevice += 'BLELocation,';\\n                                    }\\n                                    if ((statusInt & 16) == 16) {\\n                                        statusDevice += 'Charging,';\\n                                    }\\n                                    if ((statusInt & 32) == 32) {\\n                                        statusDevice += 'FUllyCharged,';\\n                                    }\\n                                    if ((statusInt & 64) == 64) {\\n                                        statusDevice += 'Reboot,';\\n                                    }\\n                                    if ((statusInt & 128) == 128) {\\n                                        statusDevice += 'HistoricalData,';\\n                                    }\\n                                    if ((statusInt & 256) == 256) {\\n                                        statusDevice += 'AGPSDataValid,';\\n                                    }\\n                                    if ((statusInt & 512) == 512) {\\n                                        statusDevice += 'Motion,';\\n                                    }\\n                                    if ((statusInt & 1024) == 1024) {\\n                                        statusDevice += 'SmartLocating,';\\n                                    }\\n                                    if ((statusInt & 2048) == 2048) {\\n                                        statusDevice += 'BeaconLocation,';\\n                                    }\\n                                    if ((statusInt & 4096) == 4096) {\\n                                        statusDevice += 'BLEConnected,';\\n                                    }\\n                                    statusDevice = statusDevice.slice(0, -1);\\n                                    //   debug('statusHex:' + statusHex)\\n                                    statusHex = (statusHex);\\n                                    statusHex = hexToBin(statusHex);\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                                    //    debug(statusHex)\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                                    //    debug(battery_percentage)\\n                                    //    debug(battery_percentage)\\n                                    //    debug(statusHex.substring(8, 13))\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                                    //    debug(cellNetworkSignal)\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\n                                    //    debug(workMode)\\n                                    general += 'statusDevice:' + statusDevice + ';';\\n                                    if (battery_percentage) {\\n                                        general += 'battery:' + battery_percentage + ';';\\n                                    }\\n                                    if (cellNetworkSignal) {\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n                                    }\\n                                    if (workMode) {\\n                                        general += 'workMode:' + workMode + ';';\\n                                    }\\n                                }\\n                            }\\n                            // revisar\\n                            var gen_location = '0';\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '12': // Device requesting timestamp\\n                            timestamp = moment.utc().unix();\\n                            timestampHex = decimalToHex(timestamp);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n                            // respond to device with the timestamp of the server\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '21': //Cell Towers\\n                            var mccHex = value.substring(0, 2);\\n                            var mncHex = value.substring(2, 3);\\n                            var mcc = hexToDecimal(mccHex);\\n                            var mnc = hexToDecimal(mncHex);\\n                            var numTowers = (keyLength - 4) / 5;\\n                            var cellTowers = hexToAscii(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '22': // WIFI locations \\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            gen_location = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            gen_location = gen_location.slice(0, -1);\\n                            general += gen_location;\\n                            //CustomID is not provided so far with command type 03\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            alarmCode = '';\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '04') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7E') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7F') {\\n                // while (index < total_length + 16) {\\n                var keyLength = message.substring(index, index = index + 2);\\n                keyLength = 2 * hexToDecimal(keyLength);\\n                var key = message.substring(index, index = index + 2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                var value = message.substring(index, index = index + keyLength - 2);\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n                //}\\n            }\\n            if (command == 'FE') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            // prepare the ACK msg and change config if it is needed\\n            lengthAck = messageBody.length / 2;\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n            ////////////checksum CRC 16\\n            var checksumAck = byteStringToByteArray(messageBody);\\n            checksumAck = crc16byte(checksumAck);\\n            checksumAck = decimalToHex(checksumAck);\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\n            // To send ACK to the device previous to internal msg with parts\\n            if (needsAck == true) {\\n                if (messageBody.length <= 2) {\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n                } else {\\n                    ack = prefix + messageBody;\\n                }\\n                AddValue(codeValues, 'imei', imei);\\n                AddValue(codeValues, 'ack', ack);\\n            }\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n            if (i >= 0) {\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n    // Auxiliary functions\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n        const dataToReceiver = {\\n            values: codeValues\\n        };\\n        if (configsToAck.length > 0) {\\n            dataToReceiver.configsToAck = configsToAck;\\n        }\\n        if (configsToUpdate.length > 0) {\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\n        }\\n        if (configsToSend.length > 0) {\\n            dataToReceiver.configsToSend = configsToSend;\\n        }\\n        return dataToReceiver;\\n    }\\n\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        var cvpair = {\\n            code: p1,\\n            value: p2\\n        };\\n        codeValueArray.push(cvpair);\\n    }\\n    // convert functions\\n    function asciiToHex(str) { // ascii to hex \\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n    }\\n\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n        const bytes = [];\\n        for (let i = 0; i < str.length; i += 2) {\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n                bytes.push(byte);\\n            }\\n        }\\n        return bytes;\\n    }\\n\\n    function decimalToHex(x) {\\n        return Number(x).toString(16).toUpperCase();\\n    }\\n\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n        const bin = parseInt(hex, 16).toString(2);\\n        return bin.padStart(hex.length * 4, '0');\\n    }\\n\\n    function hexToAscii(hex) {\\n        if (hex.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 !== 0) {\\n            hex = '0' + hex;\\n        }\\n        const num = parseInt(hex, 16);\\n        const bits = hex.length * 4;\\n        const maxVal = 2 ** bits;\\n        return num >= maxVal / 2 ? num - maxVal : num;\\n    }\\n\\n    function hexToDecimal(hex) {\\n        return parseInt(hex, 16);\\n    }\\n    // CheckSum and debug functions\\n    function changeEndianness(hexString) { // changeEndianness\\n        if (hexString.length === 0) { //if string is empty or not defined\\n            return \\\"\\\";\\n        }\\n        if (hexString.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n            .reverse() // reverse the order\\n            .join('');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n        const bytes = byteStringToByteArray(payloadData);\\n        const crc = crc16byte(bytes);\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n        return changeEndianness(hex);\\n    }\\n\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n        let crc = 0x0000;\\n        for (const byte of byteArray) {\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\n            }\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\n            crc = crcTable[index] ^ (crc << 8);\\n        }\\n        return crc & 0xFFFF;\\n    }\\n\\n    function debug(...args) { // write debug info to console log, if localTesting\\n        if (localTesting) {\\n            console.debug('[DEBUG]', ...args);\\n        }\\n    }\\n    /*\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n        var server;\\n        if (localTesting) {\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5878, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5878, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }*/\\n    function sendMessageToLocalhostNoWait(message) {\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\n        const port = '5678'; //acceptance-dev\\n        if (localTesting) {\\n            console.debug('[DEBUG] Sending message to test server:', message);\\n        }\\n        const client = net.createConnection(port, server, () => {\\n            client.write(message);\\n            client.end();\\n        });\\n        client.on('error', (err) => {\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n        });\\n        client.on('end', () => {\\n            if (localTesting) {\\n                console.debug('[DEBUG] Connection closed');\\n            }\\n        });\\n    }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n    module.exports = {\\n        execute_ops\\n    }\\n} else { // on server use local defined vars\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n    // define global returns\\n    msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744733497},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n    ///////////////////////////////////////////////////////////////////////////////\\n    //\\n    // Roam protocol - please see variables and typical values in order below\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\n    //\\n    // Author: Juanmi Navarro\\n    // Created: 01/01/0000\\n    // Last modified: 11/04/2025\\n    //\\n    ///////////////////////////////////////////////////////////////////////////////\\n    if (typeof localTesting === \\\"undefined\\\") {\\n        let localTesting = \\\"False\\\";\\n    }\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n    ];\\n    var codeValues = [];\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\n    var dataToReceiver = [];\\n    var configsToAck = [];\\n    var configsToUpdate = [];\\n    var configsToSend = [];\\n    if (globalTemplate == \\\"True\\\") {\\n        if (raw.startsWith('esendex')) {\\n            AddValue(codeValues, 'rawMsg', raw);\\n            //general SMS message\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\n            return;\\n        }\\n        AddValue(codeValues, 'raw', raw);\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\n        var homeBeacon = '';\\n        var homeWiFi = '';\\n        var contacts = '';\\n        var gps_data = '';\\n        var wifi_data = '';\\n        var status_data = '';\\n        var lbs_data = '';\\n        var beacon_data = '';\\n        var ble_data = '';\\n        var smart_data = '';\\n        //parse header & properties\\n        var message = rawFromBytes;\\n        var properties = message.substring(2, 4);\\n        var lengthLittleEndian = message.substring(4, 8);\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\n        var messageForReceiver;\\n        var sequenceID = message.substring(12, 16);\\n        var command = message.substring(16, 18);\\n        var index = 18;\\n        var prefix = 'AB' + '00';\\n        var lengthAck = 0;\\n        var ack = '';\\n        var needsAck = false;\\n        var hasConfigs = false;\\n        var general = '';\\n        var timestamp = '';\\n        var info = '';\\n        var customID = '';\\n        latitude = 0;\\n        longitude = 0;\\n        location_accuracy = 0; // GPS location adds the accuracy\\n        location_time = event_time = '';\\n        speed = 0.0;\\n        var location_type = '0';\\n        //var gen_location = '0'; \\n        var i; // general loop counter\\n        var battery_percentage = '';\\n        var cellNetworkSignal = '';\\n        var workMode = '';\\n        //mask bitwise   (properties should be '10')\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\n            needsAck = true;\\n        }\\n        // Loop to decode multi-ACK msg\\n        if (message.includes('AB00030008C7')) {\\n            const multiack = message.split('AB00');\\n            for (let i = 1; i < multiack.length; i++) {\\n                message = 'AB00' + multiack[i];\\n                debug(message);\\n                decoder(message);\\n            } // FOR multiACK\\n        } else decoder(message); // IF multiACK\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\n        AddValue(codeValues, 'rawMsg', raw);\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\n            var gen_location = params.gps_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var location_accuracy = gen_location[2];\\n            var speed = gen_location[3];\\n            var direction = gen_location[4];\\n            var altitude = gen_location[5];\\n            var satellites = gen_location[6];\\n            var mileage = gen_location[7];\\n            if (location_accuracy !== 0) {\\n                var fix_state = 1;\\n            } else {\\n                var fix_state = 0;\\n            }\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            AddValue(codeValues, 'speed', speed);\\n            AddValue(codeValues, 'direction', direction);\\n            AddValue(codeValues, 'altitude', altitude);\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\n            AddValue(codeValues, 'mileage', mileage);\\n            AddValue(codeValues, 'satellites', satellites);\\n            AddValue(codeValues, 'fix_state', fix_state);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\n            var variables = []; //Define array\\n            variables = params.lbs_data.split(',');\\n            var index = 2;\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\n                    AddValue(codeValues, 'mcc', variables[0]);\\n                    AddValue(codeValues, 'mnc', variables[1]);\\n                    AddValue(codeValues, 'lac', variables[index]);\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\n                }\\n                index += 3;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\n            var bssid_array = params.wifi_data.split(',');\\n            var index = 0;\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\n                }\\n                index += 2;\\n            }\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        //  when Beacon is detected and it isn't flic BLE detected\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\n            var gen_location = params.beacon_data.split(',');\\n            var latitude = gen_location[0];\\n            var longitude = gen_location[1];\\n            var mac = gen_location[2];\\n            var label = gen_location[3];\\n            AddValue(codeValues, 'latitude', latitude);\\n            AddValue(codeValues, 'longitude', longitude);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac) {\\n                AddValue(codeValues, 'beacon_mac', mac);\\n                var simpleQuery = [{\\n                    'code': 'Mac',\\n                    'value': mac,\\n                }];\\n                var simpleQueryLabel = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery\\n                };\\n                var labels = [];\\n                labels.push(JSON.stringify(simpleQueryLabel));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\n            var gen_location = params.ble_data.split(',');\\n            var flag = gen_location[0];\\n            var batLevel = gen_location[1];\\n            var mac2 = gen_location[2];\\n            //var label = gen_location[3];\\n            AddValue(codeValues, 'flagBLE', flag);\\n            AddValue(codeValues, 'batBLE', batLevel);\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\n            // AddValue(codeValues,'beacon_mac', mac);\\n            //AddValue(codeValues,'beacon_major', 0);\\n            //AddValue(codeValues,'beacon_minor', 0);\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\n            if (mac2) {\\n                AddValue(codeValues, 'beacon_mac', mac2);\\n                var simpleQuery2 = [{\\n                    'code': 'Mac',\\n                    'value': mac2,\\n                }];\\n                var simpleQueryLabel2 = {\\n                    'table': 'beacons',\\n                    'select': 'Name',\\n                    'query': simpleQuery2\\n                };\\n                var labels2 = [];\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\n            }\\n            if (params.beacon_major) {\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\n            } else {\\n                AddValue(codeValues, 'beacon_major', 0);\\n            }\\n            if (params.beacon_minor) {\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\n            } else {\\n                AddValue(codeValues, 'beacon_minor', 0);\\n            }\\n            //AddValue(codeValues,'oysta_labels', label);\\n            //AddValue(codeValues,'oysta_value', mac);\\n            if (location_time) {\\n                AddValue(codeValues, 'location_time', location_time);\\n            }\\n        }\\n        /*  meter mas tarde...   \\n            if (params.smart_data !== 'undefined') {\\n                var gen_location = params.smart_data.split(',')\\n                var latitude = gen_location[0]\\n                var longitude = gen_location[1]\\n                var location_accuracy = gen_location[2]\\n                var altitude = gen_location[3]\\n                AddValue(codeValues,'latitude', latitude);\\n                AddValue(codeValues,'longitude', longitude);\\n                AddValue(codeValues,'altitude', altitude);\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\n            }\\n          */\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues,'event_time', event_time);\\n        }  revisar mas adelante*/\\n        // to parse SMS info from the device\\n        switch (messageTypeLocalCode) {\\n            case 'COMM-SMS': // SMS message sent in\\n                if (params.data.startsWith('Device location request')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('IMEI:')) {\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\n                } else if (params.data.startsWith('Set IP ok')) {\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\n                } else if (params.data.startsWith('flush ok')) {\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\n                } else if (params.data.startsWith('Set Roam-')) {\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\n                } else if (params.data.startsWith('set live tracking')) {\\n                    configsToAck.push(configIds.Controls.Trace);\\n                } else if (params.data.startsWith('reboot ok')) {\\n                    configsToAck.push(configIds.Controls.Reboot);\\n                } else if (params.data.startsWith('GPS')) {\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\n                    var i1 = params.data.search('Now:')\\n                    var i2 = params.data.search('Loc Time:')\\n                    var i3 = params.data.search('Speed:')\\n                    var i4 = params.data.search('Altitude:')\\n                    var i5 = params.data.search('Battery:')\\n                    var i6 = params.data.search('google')\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                        Speed = Speed * 0.44704\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                        Speed = Speed / 3.6\\n                    }\\n                    var latlong = params.data.substring(i6 + 18)\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                break;\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\n                //var i1 = params.data.search('IMEI:')\\n                //var i2 = params.data.search('GSM signal quality:')\\n                var i3 = params.data.search('Software version:')\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\n                var i4 = sub.search('version:');\\n                var fwVersion = sub.substring(i4, sub.length);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                break;\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\n                var i1 = params.data.search('Fall alarm:');\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\n                var i2 = params.data.search('level:');\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\n                break;\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\n                var i1 = raw.search('1,');\\n                //var i2 = params.data.search('2,');\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                break;\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = raw.search('A1:');\\n                if (raw.includes('A2:')) {\\n                    var i2 = raw.search('A2:');\\n                } else {\\n                    var i2 = raw.search('A10:');\\n                }\\n                var tel = raw.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                i2 = raw.search('A10:')\\n                tel = raw.substring(i2 + 4, raw.length);\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                break;\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                var i1 = params.data.search('APN:')\\n                var i2 = params.data.search('IP:')\\n                var i3 = params.data.search('Move')\\n                var apn = params.data.substring(i1 + 4, i2);\\n                AddValue(codeValues, \\\"apn\\\", apn);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\n                var i3 = params.data.search('Speed:')\\n                var i4 = params.data.search('Altitude:')\\n                var i5 = params.data.search('Battery:')\\n                var i6 = params.data.search('google')\\n                var eventTime = params.data.substring(0, i3)\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\n                    Speed = Speed * 0.44704\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\n                    Speed = Speed / 3.6\\n                }\\n                var latlong = params.data.substring(i6 + 18)\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                break;\\n        }\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\n            var event_time = moment.utc().unix();\\n            AddValue(codeValues, 'event_time', event_time);\\n        }\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\n        //    var location_time = moment.utc().unix();\\n        //    AddValue(codeValues, 'location_time', location_time);\\n        //}\\n    }\\n    // send data msg to kibana\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n    console.log(data);\\n    return data\\n    // end of main operation\\n    // define functions used in operation\\n    // decode global msg\\n    function decoder(str) { // decode rawdata\\n        // CARE Decoder\\n        AddValue(codeValues, 'Message : ', str);\\n        var message = str;\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\n        var checksum = message.substring(8, 12);\\n        var messageBody = message.substring(16, message.length);\\n        debug('message =' + message);\\n        debug('checksum =' + checksum);\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\n            debug(\\\"message has valid checksum\\\");\\n            var messageBody = command; // update value for the ACK\\n            debug('command =' + command);\\n            if (command == '01') {\\n                while (index < total_length + 16) {\\n                    // gen_location = '0'; //cambiado 30/09\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        //Device ID\\n                        case '01':\\n                            var imei = hexToAscii(value);\\n                            break;\\n                            //Alarm code\\n                        case '02':\\n                            var alarm = 'CYC';\\n                            var alarmCode = value.substring(0, 8);\\n                            alarmCode = changeEndianness(alarmCode);\\n                            var timestampHex = value.substring(8, 16);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            event_time = timestamp;\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\n                            var alarmCodeExt = value.substring(16, 24);\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\n                            //Extended Alerts\\n                            // Fall off\\n                            if ((alarmCodeExtInt & 1) == 1) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // Welfare Check-out\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Standard Alerts\\n                            //Battery low\\n                            else if ((alarmCodeInt & 1) == 1) {\\n                                var alarm = 'BATL';\\n                            }\\n                            //Overspeed\\n                            else if ((alarmCodeInt & 2) == 2) {\\n                                var alarm = 'ALSP';\\n                            }\\n                            //Fall\\n                            else if ((alarmCodeInt & 4) == 4) {\\n                                var alarm = 'ALF';\\n                            }\\n                            //Tilt\\n                            else if ((alarmCodeInt & 8) == 8) {\\n                                var alarm = 'Tilt';\\n                            } else if ((alarmCodeInt & 16) == 16) {\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\n                                    var alarm = 'Geo1-IN';\\n                                } else {\\n                                    var alarm = 'Geo1-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 32) == 32) {\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\n                                    var alarm = 'Geo2-IN';\\n                                } else {\\n                                    var alarm = 'Geo2-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 64) == 64) {\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\n                                    var alarm = 'Geo3-IN';\\n                                } else {\\n                                    var alarm = 'Geo3-OUT';\\n                                }\\n                            } else if ((alarmCodeInt & 128) == 128) {\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\n                                    var alarm = 'Geo4-IN';\\n                                } else {\\n                                    var alarm = 'Geo4-OUT';\\n                                }\\n                            }\\n                            //Power Off\\n                            else if ((alarmCodeInt & 256) == 256) {\\n                                var alarm = 'PWRF';\\n                            }\\n                            //Power On\\n                            else if ((alarmCodeInt & 512) == 512) {\\n                                var alarm = 'PWRN';\\n                            }\\n                            //Motion\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\n                                var alarm = 'ALMOV';\\n                            }\\n                            //No Motion\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\n                                var alarm = 'ALNM';\\n                            }\\n                            //SOS\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\n                                var alarm = 'ALSOS';\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\n                                var alarm = 'Side1';\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\n                                var alarm = 'Side2';\\n                            }\\n                            //Battery charging\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\n                                var alarm = 'BATCN';\\n                            }\\n                            //Battery no charging\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\n                                var alarm = 'BATCF';\\n                            }\\n                            //SOS Ending\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\n                                var alarm = 'SOSEnding';\\n                                info = 'Alarm Finished';\\n                            }\\n                            //Amber Alert  EC03 only\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\n                                var alarm = 'ALAO';\\n                            }\\n                            // welfare Alert check-in ALA-O\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\n                                var alarm = 'ALA-O';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\n                                var alarm = 'ALA-C';\\n                            }\\n                            // Amber alert Ending  ALA-C\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\n                            //    var alarm = 'ALA-C';\\n                            //}\\n                            // Fall-Down Alert ending\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\n                                var alarm = 'ALF-C';\\n                            }\\n                            // welfare Alert Ending  ALA\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\n                                var alarm = 'ALA';\\n                            }\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\n                            //    var alarm = 'BEA';\\n                            //}\\n                            general += 'alarm:' + alarm + ',';\\n                            break;\\n                            //Custom ID\\n                        case '03':\\n                            // in value is customID.... '06' for Watch Care\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //update customID to check if belongs to this type of device\\n                            customID = value;\\n                            if (value != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                // exit decoder\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\n                                // console.log(data);\\n                                return // data\\n                            } else {\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    //return;\\n                                }\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                general += 'customID:' + value + ',';\\n                                break;\\n                            }\\n                            //Historical Data Completed\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\n                            var histData = true;\\n                            break;\\n                            //GPS location\\n                        case '20':\\n                            location_type = 'GPS';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var speedHex = value.substring(16, 20);\\n                            var directionHex = value.substring(20, 24);\\n                            var altitudeHex = value.substring(24, 28);\\n                            var location_accuracyHex = value.substring(28, 32);\\n                            var mileageHex = value.substring(32, 40);\\n                            var satellitesHex = value.substring(40, 42);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            // Range: 0.5 to 99.9  \\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\n                            var satellites = hexToDecimal(satellitesHex);\\n                            // location_time = timestamp;\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //WIFI Towers\\n                        case '22':\\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            wifi_data = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            wifi_data = wifi_data.slice(0, -1);\\n                            general += wifi_data;\\n                            break;\\n                            //BLE Location  Added 10/10/22\\n                        case '23':\\n                            location_type = 'BLE';\\n                            var mac = value.substring(0, 12);\\n                            var latitudeHex = value.substring(12, 20);\\n                            var longitudeHex = value.substring(20, 28);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var address = hexToAscii(value.substring(28, value.length));\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            // location_time = timestamp;\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //General Data ,  status_data\\n                        case '24':\\n                            //var general = 'true'\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            }\\n                            //else {\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\n                            //}\\n                            // reset variables\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\n                            var timestampHex = value.substring(0, 8);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            timestamp = hexToDecimal(timestampHex);\\n                            location_time = timestamp;\\n                            event_time = timestamp;\\n                            // HardCode to fix possible issue in protocol\\n                            //event_time = moment.utc().unix();\\n                            // end of hard code\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\n                            var statusInt = hexToDecimal(statusHex);\\n                            var statusDevice = '';\\n                            if ((statusInt & 1) == 1) {\\n                                statusDevice += 'GPS,';\\n                            }\\n                            if ((statusInt & 2) == 2) {\\n                                statusDevice += 'WIFISource,';\\n                            }\\n                            if ((statusInt & 4) == 4) {\\n                                statusDevice += 'CellTower,';\\n                            }\\n                            if ((statusInt & 8) == 8) {\\n                                statusDevice += 'BLELocation,';\\n                            }\\n                            //params.BatteryStatus.BatteryStatus = '1';\\n                            if ((statusInt & 16) == 16) {\\n                                statusDevice += 'Charging,';\\n                                // var alarm = 'BATCN';\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '1';\\n                                     var alarm = 'BATCN';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            if ((statusInt & 32) == 32) {\\n                                statusDevice += 'FUllyCharged,';\\n                                //var alarm = 'BATF';\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\n                                     hasConfigs = true;\\n                                     var batteryStatus = '3';\\n                                     var alarm = 'BATF';\\n                                     let configsToUpdate = [];\\n                                     configsToUpdate.push({\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\n                                         'value': batteryStatus\\n                                     });\\n                                 }*/\\n                            }\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\n                                 statusDevice += 'Not Charging,';\\n                                 var alarm = 'BATCF';\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\n                                       var batteryStatus = '2';\\n                                       var alarm = 'BATCF';\\n                                       let configsToUpdate = [];\\n                                       configsToUpdate.push({\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\n                                           'value': batteryStatus\\n                                       });\\n                                   }\\n                             }*/\\n                            if ((statusInt & 64) == 64) {\\n                                statusDevice += 'Reboot,';\\n                            }\\n                            if ((statusInt & 128) == 128) {\\n                                statusDevice += 'HistoricalData,';\\n                            }\\n                            if ((statusInt & 256) == 256) {\\n                                statusDevice += 'AGPSDataValid,';\\n                            }\\n                            if ((statusInt & 512) == 512) {\\n                                statusDevice += 'Motion,';\\n                            }\\n                            if ((statusInt & 1024) == 1024) {\\n                                statusDevice += 'SmartLocating,';\\n                            }\\n                            if ((statusInt & 2048) == 2048) { //isHome\\n                                statusDevice += 'BeaconLocation,';\\n                            }\\n                            if ((statusInt & 4096) == 4096) {\\n                                statusDevice += 'BLEConnected,';\\n                            }\\n                            if ((statusInt & 16384) == 16384) {\\n                                statusDevice += 'HomeWiFi,';\\n                            }\\n                            statusDevice = statusDevice.slice(0, -1);\\n                            status_data = statusDevice; //to oysta template\\n                            //statusHex = (statusHex);\\n                            statusHex = hexToBin(statusHex);\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\n                            general += 'statusDevice:' + statusDevice + ',';\\n                            if (battery_percentage) {\\n                                general += 'battery:' + battery_percentage + ',';\\n                            }\\n                            if (cellNetworkSignal) {\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\n                            }\\n                            if (workMode) {\\n                                general += 'workMode:' + workMode + ',';\\n                            }\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\n                            break;\\n                            //Call Records\\n                        case '25':\\n                            //Needed?\\n                            break;\\n                            //BLE Location 2\\n                        case '26':\\n                            //I don't understand\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Smart Location\\n                        case '27':\\n                            location_type = 'SMART';\\n                            var latitudeHex = value.substring(0, 8);\\n                            var longitudeHex = value.substring(8, 16);\\n                            var location_accuracyHex = value.substring(16, 20);\\n                            var altitudeHex = value.substring(20, 24);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\n                            //location_time = timestamp;\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\n                            break;\\n                            //Beacon Location  Added 11/10/22\\n                        case '28':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                                descr = hexToAscii(value.substring(34, value.length));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            // var latitudeHex = value.substring(18, 26);\\n                            // var longitudeHex = value.substring(26, 34);\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            // Beacon V2\\n                        case '2C':\\n                            location_type = 'BEACON';\\n                            // var alarm = 'EBZI';\\n                            var latitudeHex = '00';\\n                            var longitudeHex = '00';\\n                            var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 1));\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\n                            // msg includes descrip\\n                            if ((flag & 4) == 4) {\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\n                                //descr = hexToAscii(value.substring(18, value.length));\\n                            }\\n                            // msg includes lat/lon\\n                            if ((flag & 8) == 8) {\\n                                latitudeHex = value.substring(18, 26);\\n                                longitudeHex = value.substring(26, 34);\\n                            }\\n                            // msg includes lat/lon and description\\n                            if ((flag & 12) == 12) {\\n                                latitudeHex = value.substring(20, 28);\\n                                longitudeHex = value.substring(28, 36);\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\n                            }\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var rssiHex = value.substring(14, 16);\\n                            var rssi1Hex = value.substring(16, 18);\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\n                            //location_time = timestamp;\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\n                            break;\\n                            //Cell Towers Note\\n                        case '29':\\n                            location_type = 'LBS';\\n                            lbs_data = '';\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\n                            var mncHex = value.substring(4, 6);\\n                            var mcc = hexToDecimal(mccHex);\\n                            lbs_data += mcc + ',';\\n                            var mnc = hexToDecimal(mncHex);\\n                            lbs_data += mnc + ',';\\n                            var indexLbs = 6;\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\n                            for (let i = 0; i < numTowers; i++) {\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\n                                var rxl = hexToDecimal(rxlHex);\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\n                                var lac = hexToDecimal(lacHex);\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\n                                indexLbs += 14;\\n                            }\\n                            lbs_data = lbs_data.slice(0, -1);\\n                            general += lbs_data;\\n                            break;\\n                        case '30':\\n                            //G-sensor. \\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numStep = (keyLength - 2) / 16;\\n                            for (let j = 0; j < numStep; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var stepHex = value.substring(8, 16);\\n                                stepHex = changeEndianness(stepHex);\\n                                var stepRate = hexToDecimal(stepHex);\\n                                info = stepRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'STP';\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //Activity\\n                        case '31':\\n                            //I don't understand\\n                            break;\\n                            //BLE MAC list\\n                        case '32':\\n                            //I don't understand\\n                            break;\\n                            //Beacon List\\n                        case '33':\\n                            //I don't understand\\n                            break;\\n                            //Heart Rate Data\\n                        case '40':\\n                            if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }\\n                            var numHeartRate = (keyLength - 2) / 12;\\n                            for (let j = 0; j < numHeartRate; j++) {\\n                                var timestampHex = value.substring(0, 8);\\n                                timestampHex = changeEndianness(timestampHex);\\n                                timestamp = hexToDecimal(timestampHex);\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\n                                var heartRateHex = value.substring(8, 10);\\n                                var heartRate = hexToDecimal(heartRateHex);\\n                                var trustLevelHex = value.substring(10, 12);\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\n                                info = heartRate;\\n                                //var alarmCode = 'True';\\n                                var alarm = 'HRT';\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            break;\\n                            //BLE Connected  . For Flic button\\n                        case '62':\\n                            location_type = 'BLE';\\n                            //var alarm = 'EBZI'; \\n                            //var latitudeHex = '00';\\n                            //var longitudeHex = '00';\\n                            //var descr = 'empty';\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\n                            // add : format in MAC\\n                            mac = mac.match(/.{1,2}/g).join(':');\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\n                            //location_time = timestamp;\\n                            ble_data = `${flag},${batLevel},${mac}`;\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\n                            break;\\n                    }\\n                }\\n                if (alarmCode) {\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                } else if (statusDevice) {\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\n                }\\n                /*else if (alarm === 'HRT') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else if (alarm === 'STP') {\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           } else {\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\n                           }*/\\n                // rest the alarm value\\n                alarm = '';\\n            }\\n            if (command == '02') {\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    switch (key) {\\n                        //Module Number\\n                        case '01':\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Firmware version\\n                        case '02':\\n                            //no ACK need\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1A':\\n                            //no ACK need\\n                            var fwVersion = hexToAscii(value);\\n                            imei = serverParams.Imei;\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\n                            break;\\n                            //IMEI\\n                        case '03':\\n                            var imei = hexToDecimal(value);\\n                            // harcode to avoid conflicts with Rio protocol\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\n                            //    return\\n                            //}\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //ICCID\\n                        case '04':\\n                            var iccid = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //BLE-MAC\\n                        case '05':\\n                            var bleMac = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                            //Run Time\\n                        case '07':\\n                            var runTime = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '10': // Ringer Volume\\n                            var volume = hexToDecimal(value);\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\n                            break;\\n                        case '0A': //Performance  mode\\n                            //var workMode = hexToDecimal(value);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            //var workMode = hexToDecimal(value);\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\n                            var workMode = 1234; // + value + \\\"end\\\";\\n                            //var workModeVal = 9;\\n                            //workMode = 'test10';\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            break;\\n                        case '1B':\\n                            //Decimal o ascii?\\n                            var gsmModule = hexToDecimal(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '1F':\\n                            //System Language\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\n                            break;\\n                        case '33': // phone option\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\n                                var auto = 'true';\\n                            } else var auto = 'false';\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\n                                allow = 'true';\\n                            } else var allow = 'false';\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\n                            break;\\n                        case '30': //ContactList\\n                            var contactNumber = value.substring(1, 2);\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\n                            var tel = '';\\n                            switch (contactNumber) {\\n                                // Emergency Number\\n                                case '0':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\n                                    break;\\n                                    // Speed Dial Number\\n                                case '1':\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\n                                    break;\\n                                    // Gateway Number\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\n                                        tel = 'Esendex UK'\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\n                                        tel = 'Esendex Spain'\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\n                                        tel = 'Esendex UK Acceptance'\\n                                    } else {\\n                                        tel = 'Default'\\n                                    }\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\n                                    break;\\n                                default:\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\n                                    if (tel.length < 6) {\\n                                        contacts += '';\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                        break;\\n                                    }\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\n                                    contacts += tel + ', ';\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\n                                    break;\\n                            }\\n                            break;\\n                        case '40': // APN\\n                            //no ACK need\\n                            var apn = hexToAscii(value.substring(0, value.length));\\n                            imei = serverParams.Imei;\\n                            break;\\n                        case '41': // APN Username\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            break;\\n                        case '42': // APN Password\\n                            //no ACK need\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\n                            break;\\n                        case '43': //Server Details\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\n                                serverDetails = 'Production'\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\n                                serverDetails = 'Acceptance'\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\n                                serverDetails = 'Protocol-Import'\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\n                                serverDetails = 'Protocol-Dev'\\n                            } else {\\n                                serverDetails = 'Default'\\n                            }\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\n                            break;\\n                        case '44': //time interval - work mode intervals\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\n                            var workMode = 0;\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\n                                //workMode = 'High Frequency';\\n                                workMode = 3;\\n                            }\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\n                                //workMode = 'Balanced';\\n                                workMode = 2;\\n                            }\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\n                                //workMode = 'Power Saving';\\n                                workMode = 1;\\n                            }\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\n                                //workMode = 'No Reporting';\\n                                workMode = 0;\\n                            }\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '47': // Custom Id\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\n                            configsToAck.push(configIds.ReadState.CustomId);\\n                            break;\\n                        case '53': // Non motion alert\\n                            //2B020080\\n                            var status = hexToBin(value.substring(6, 8));\\n                            var alertSetting = '';\\n                            var enableDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enableDisable = '1';\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                            };\\n                            //if (status.substring(5, 6) == '1') {\\n                            //    alertSetting += 'Dial, '\\n                            //} else {\\n                            //    alertSetting += 'No Dial, '\\n                            //};\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                        case '56': //Fall down sensibility\\n                            // '00001100'\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\n                            var enalbleDisable = '';\\n                            //if (fallStatus.substring(4, 5) == '1') {\\n                            if (fallStatus.substring(0, 1) == '1') {\\n                                var sensibility = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                var sensibility = 'Disable, '\\n                            };\\n                            if (fallStatus.substring(5, 6) == '1') {\\n                                sensibility += 'Dial, '\\n                            } else {\\n                                sensibility += 'No Dial, '\\n                            };\\n                            var imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\n                            sensibility += sesibityOptionValue;\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\n                            break;\\n                        case '73': //BeaconList\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\n                            homeBeacon += beaconStatus + ', ';\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\n                            break;\\n                        case '4A': //Wifi Network List\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\n                            var wifiStatus = value.substring(0, 1);\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\n                            /var homeWifi = '';\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\n                                if (wifiStatus == '8') {\\n                                    homeWifi += ' Enable, '\\n                                    enalbleDisable = '1';\\n                                } else {\\n                                    homeWifi += ' Disable, '\\n                                    //enalbleDisable = '0';\\n                                };*/\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\n                                var imei = serverParams.Imei;\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\n                            }\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\n                            break;\\n                        case '21': // Speed Dial Settings\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\n                            var alertSetting = '';\\n                            var enalbleDisable = '';\\n                            if (status.substring(0, 1) == '1') {\\n                                alertSetting = 'Enable, '\\n                                enalbleDisable = '1'\\n                            } else {\\n                                alertSetting = 'Disable, '\\n                                //enableDisable = '0';\\n                            };\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\n                            //alertSetting += time;\\n                            imei = serverParams.Imei;\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '03') {\\n                while (index < total_length + 16) {\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                    debug('key = ' + key);\\n                    debug('value = ' + value);\\n                    switch (key) {\\n                        case '01': // Device ID\\n                            var imei = hexToAscii(value);\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                //return;\\n                            }\\n                            break;\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /* case '03':\\n                                //update customID to check if belongs to this type of device\\n                                customID = value;\\n                                if (value != '04') {\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    return\\n                                } else {\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\n                                    }\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\n                                    general += 'customID:' + value + ',';\\n                                    break;\\n                                }\\n                                break; */\\n                        case '10': // Heartbeat\\n                            var heartbeat = hexToAscii(value);\\n                            event_time = moment.utc().unix();\\n                            if (index < total_length + 16) {\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\n                                key = message.substring(index, index = index + 2);\\n                                if (key == '24') {\\n                                    //     debug('key: ' + key) //comment those out\\n                                    value = message.substring(index, index = index + keyLength - 2);\\n                                    //    debug(value)\\n                                    var timestampHex = value.substring(0, 8);\\n                                    //    debug('timestampt hex: ' + timestampHex)\\n                                    timestampHex = changeEndianness(timestampHex);\\n                                    timestamp = hexToDecimal(timestampHex);\\n                                    event_time = timestamp;\\n                                    //    debug(event_time)\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\n                                    //    debug(statusHex)\\n                                    var statusInt = hexToDecimal(statusHex);\\n                                    var statusDevice = '';\\n                                    if ((statusInt & 1) == 1) {\\n                                        statusDevice += 'GPS,';\\n                                    }\\n                                    if ((statusInt & 2) == 2) {\\n                                        statusDevice += 'WIFISource,';\\n                                    }\\n                                    if ((statusInt & 4) == 4) {\\n                                        statusDevice += 'CellTower,';\\n                                    }\\n                                    if ((statusInt & 8) == 8) {\\n                                        statusDevice += 'BLELocation,';\\n                                    }\\n                                    if ((statusInt & 16) == 16) {\\n                                        statusDevice += 'Charging,';\\n                                    }\\n                                    if ((statusInt & 32) == 32) {\\n                                        statusDevice += 'FUllyCharged,';\\n                                    }\\n                                    if ((statusInt & 64) == 64) {\\n                                        statusDevice += 'Reboot,';\\n                                    }\\n                                    if ((statusInt & 128) == 128) {\\n                                        statusDevice += 'HistoricalData,';\\n                                    }\\n                                    if ((statusInt & 256) == 256) {\\n                                        statusDevice += 'AGPSDataValid,';\\n                                    }\\n                                    if ((statusInt & 512) == 512) {\\n                                        statusDevice += 'Motion,';\\n                                    }\\n                                    if ((statusInt & 1024) == 1024) {\\n                                        statusDevice += 'SmartLocating,';\\n                                    }\\n                                    if ((statusInt & 2048) == 2048) {\\n                                        statusDevice += 'BeaconLocation,';\\n                                    }\\n                                    if ((statusInt & 4096) == 4096) {\\n                                        statusDevice += 'BLEConnected,';\\n                                    }\\n                                    statusDevice = statusDevice.slice(0, -1);\\n                                    //   debug('statusHex:' + statusHex)\\n                                    statusHex = (statusHex);\\n                                    statusHex = hexToBin(statusHex);\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\n                                    //    debug(statusHex)\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\n                                    //    debug(battery_percentage)\\n                                    //    debug(battery_percentage)\\n                                    //    debug(statusHex.substring(8, 13))\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\n                                    //    debug(cellNetworkSignal)\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\n                                    //    debug(workMode)\\n                                    general += 'statusDevice:' + statusDevice + ';';\\n                                    if (battery_percentage) {\\n                                        general += 'battery:' + battery_percentage + ';';\\n                                    }\\n                                    if (cellNetworkSignal) {\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\n                                    }\\n                                    if (workMode) {\\n                                        general += 'workMode:' + workMode + ';';\\n                                    }\\n                                }\\n                            }\\n                            // revisar\\n                            var gen_location = '0';\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '12': // Device requesting timestamp\\n                            timestamp = moment.utc().unix();\\n                            timestampHex = decimalToHex(timestamp);\\n                            timestampHex = changeEndianness(timestampHex);\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\n                            // respond to device with the timestamp of the server\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\n                            break;\\n                        case '21': //Cell Towers\\n                            var mccHex = value.substring(0, 2);\\n                            var mncHex = value.substring(2, 3);\\n                            var mcc = hexToDecimal(mccHex);\\n                            var mnc = hexToDecimal(mncHex);\\n                            var numTowers = (keyLength - 4) / 5;\\n                            var cellTowers = hexToAscii(value);\\n                            messageBody = messageBody + keyLengthHex + key + value;\\n                            break;\\n                        case '22': // WIFI locations \\n                            location_type = 'WIFI';\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\n                            //location_time = timestamp;\\n                            var wifiTowers = value;\\n                            general += 'wifiTowers:';\\n                            var indexWifi = 0;\\n                            var bssid_array = [];\\n                            gen_location = '';\\n                            for (let i = 0; i < numWifi; i++) {\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\n                                indexWifi += 14;\\n                            }\\n                            gen_location = gen_location.slice(0, -1);\\n                            general += gen_location;\\n                            //CustomID is not provided so far with command type 03\\n                            /*if (customID != '04') {\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n                                AddValue(codeValues, \\\"customID\\\", value);\\n                                return\\n                            }*/\\n                            if (alarmCode) {\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else if (statusDevice) {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            } else {\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\n                            }\\n                            alarmCode = '';\\n                            break;\\n                    }\\n                }\\n            }\\n            if (command == '04') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7E') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            if (command == '7F') {\\n                // while (index < total_length + 16) {\\n                var keyLength = message.substring(index, index = index + 2);\\n                keyLength = 2 * hexToDecimal(keyLength);\\n                var key = message.substring(index, index = index + 2);\\n                imei = serverParams.Imei;\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\n                var value = message.substring(index, index = index + keyLength - 2);\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\n                //}\\n            }\\n            if (command == 'FE') {\\n                while (index < total_length + 16) {\\n                    var keyLength = message.substring(index, index = index + 2);\\n                    keyLength = 2 * hexToDecimal(keyLength);\\n                    var key = message.substring(index, index = index + 2);\\n                    var value = message.substring(index, index = index + keyLength - 2);\\n                }\\n            }\\n            // prepare the ACK msg and change config if it is needed\\n            lengthAck = messageBody.length / 2;\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\n            ////////////checksum CRC 16\\n            var checksumAck = byteStringToByteArray(messageBody);\\n            checksumAck = crc16byte(checksumAck);\\n            checksumAck = decimalToHex(checksumAck);\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\n            // To send ACK to the device previous to internal msg with parts\\n            if (needsAck == true) {\\n                if (messageBody.length <= 2) {\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\n                } else {\\n                    ack = prefix + messageBody;\\n                }\\n                AddValue(codeValues, 'imei', imei);\\n                AddValue(codeValues, 'ack', ack);\\n            }\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\n            if (i >= 0) {\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\n                AddValue(codeValues, \\\"imei\\\", imei);\\n            }\\n        }\\n    }\\n    // Auxiliary functions\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\n        const dataToReceiver = {\\n            values: codeValues\\n        };\\n        if (configsToAck.length > 0) {\\n            dataToReceiver.configsToAck = configsToAck;\\n        }\\n        if (configsToUpdate.length > 0) {\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\n        }\\n        if (configsToSend.length > 0) {\\n            dataToReceiver.configsToSend = configsToSend;\\n        }\\n        return dataToReceiver;\\n    }\\n\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\n        var cvpair = {\\n            code: p1,\\n            value: p2\\n        };\\n        codeValueArray.push(cvpair);\\n    }\\n    // convert functions\\n    function asciiToHex(str) { // ascii to hex \\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\n    }\\n\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\n        const bytes = [];\\n        for (let i = 0; i < str.length; i += 2) {\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\n                bytes.push(byte);\\n            }\\n        }\\n        return bytes;\\n    }\\n\\n    function decimalToHex(x) {\\n        return Number(x).toString(16).toUpperCase();\\n    }\\n\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\n        const bin = parseInt(hex, 16).toString(2);\\n        return bin.padStart(hex.length * 4, '0');\\n    }\\n\\n    function hexToAscii(hex) {\\n        if (hex.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\n    }\\n\\n    function hexToDecimalSigned(hex) { // hex to decimal\\n        if (hex.length % 2 !== 0) {\\n            hex = '0' + hex;\\n        }\\n        const num = parseInt(hex, 16);\\n        const bits = hex.length * 4;\\n        const maxVal = 2 ** bits;\\n        return num >= maxVal / 2 ? num - maxVal : num;\\n    }\\n\\n    function hexToDecimal(hex) {\\n        return parseInt(hex, 16);\\n    }\\n    // CheckSum and debug functions\\n    function changeEndianness(hexString) { // changeEndianness\\n        if (hexString.length === 0) { //if string is empty or not defined\\n            return \\\"\\\";\\n        }\\n        if (hexString.length % 2 !== 0) {\\n            throw new Error(\\\"Hex string length must be even\\\");\\n        }\\n        return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\n            .reverse() // reverse the order\\n            .join('');\\n    }\\n\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\n        const bytes = byteStringToByteArray(payloadData);\\n        const crc = crc16byte(bytes);\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\n        return changeEndianness(hex);\\n    }\\n\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\n        let crc = 0x0000;\\n        for (const byte of byteArray) {\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\n            }\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\n            crc = crcTable[index] ^ (crc << 8);\\n        }\\n        return crc & 0xFFFF;\\n    }\\n\\n    function debug(...args) { // write debug info to console log, if localTesting\\n        if (localTesting) {\\n            console.debug('[DEBUG]', ...args);\\n        }\\n    }\\n    /*\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\n        var server;\\n        if (localTesting) {\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\n            console.log(str);\\n            server = '52.174.17.77';\\n        } else {\\n            server = '127.0.0.1';\\n        }\\n        var c = net.createConnection(5878, server);\\n        c.on('error', function(error) {\\n            c = net.createConnection(5878, server);\\n        });\\n        c.write(`${str}`);\\n        c.end();\\n    }*/\\n    function sendMessageToLocalhostNoWait(message) {\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\n        const port = '5678'; //acceptance-dev\\n        if (localTesting) {\\n            console.debug('[DEBUG] Sending message to test server:', message);\\n        }\\n        const client = net.createConnection(port, server, () => {\\n            client.write(message);\\n            client.end();\\n        });\\n        client.on('error', (err) => {\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\n        });\\n        client.on('end', () => {\\n            if (localTesting) {\\n                console.debug('[DEBUG] Connection closed');\\n            }\\n        });\\n    }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n    module.exports = {\\n        execute_ops\\n    }\\n} else { // on server use local defined vars\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n    // define global returns\\n    msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1748383508},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 11/04/2025\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            //event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length === 0) { //if string is empty or not defined\\r\\n            return \\\"\\\";\\r\\n        }\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\r\\n            .reverse() // reverse the order\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n    /*\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5878, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5878, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }*/\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\r\\n        const port = '5678'; //acceptance-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749056431},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/0000\\r\\n    // Last modified: 11/04/2025\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        let localTesting = \\\"False\\\";\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        AddValue(codeValues, 'raw', raw);\\r\\n        AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        var message = rawFromBytes;\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var messageForReceiver;\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        var index = 18;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0];\\r\\n            var batLevel = gen_location[1];\\r\\n            var mac2 = gen_location[2];\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n            if (location_time) {\\r\\n                AddValue(codeValues, 'location_time', location_time);\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n    console.log(data);\\r\\n    return data\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hexToAscii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //SOS Ending\\r\\n                            // Temporary Commented until we know exactly how it works.  22/09/2022\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'SOSEnding';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALAO';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hexToAscii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            //else {\\r\\n                            //    messageForReceiver  = (`CareWatch-CYC;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};`);\\r\\n                            //}\\r\\n                            // reset variables\\r\\n                            //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp;\\r\\n                            // HardCode to fix possible issue in protocol\\r\\n                            //event_time = moment.utc().unix();\\r\\n                            // end of hard code\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                                // var alarm = 'BATCN';\\r\\n                                //configs.BatteryStatus.BatteryStatus = '1';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '1') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '1';\\r\\n                                     var alarm = 'BATCN';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                                //var alarm = 'BATF';\\r\\n                                // configs.BatteryStatus.BatteryStatus = '3';\\r\\n                                /* if (configs.BatteryStatus.BatteryStatus !== '3') {\\r\\n                                     hasConfigs = true;\\r\\n                                     var batteryStatus = '3';\\r\\n                                     var alarm = 'BATF';\\r\\n                                     let configsToUpdate = [];\\r\\n                                     configsToUpdate.push({\\r\\n                                         'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                         'value': batteryStatus\\r\\n                                     });\\r\\n                                 }*/\\r\\n                            }\\r\\n                            /*  if (!((statusInt & 32) == 32) & !((statusInt & 16) == 16)) {\\r\\n                                 statusDevice += 'Not Charging,';\\r\\n                                 var alarm = 'BATCF';\\r\\n                                 //configs.BatteryStatus.BatteryStatus = '2';\\r\\n                                  if (configs.BatteryStatus.BatteryStatus !== '2') {\\r\\n                                       var batteryStatus = '2';\\r\\n                                       var alarm = 'BATCF';\\r\\n                                       let configsToUpdate = [];\\r\\n                                       configsToUpdate.push({\\r\\n                                           'code': configIds.BatteryStatus.BatteryStatus,\\r\\n                                           'value': batteryStatus\\r\\n                                       });\\r\\n                                   }\\r\\n                             }*/\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hexToBin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hexToAscii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hexToAscii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hexToAscii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hexToAscii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hexToAscii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hexToAscii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hexToBin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hexToBin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hexToBin(value.substring(0, 2)) + hexToBin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hexToAscii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hexToAscii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hexToAscii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hexToAscii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hexToBin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hexToBin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hexToBin(value.substring(0, 1));\\r\\n                            beaconStatus = hexToAscii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hexToAscii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hexToAscii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hexToBin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hexToAscii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /* case '03':\\r\\n                                //update customID to check if belongs to this type of device\\r\\n                                customID = value;\\r\\n                                if (value != '04') {\\r\\n                                    AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    return\\r\\n                                } else {\\r\\n                                    if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                        sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                    general += 'customID:' + value + ',';\\r\\n                                    break;\\r\\n                                }\\r\\n                                break; */\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hexToAscii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hexToBin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            //CustomID is not provided so far with command type 03.. commented in the mean time\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            //messageForReceiver = (`Eview-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};SL=${systemLanguage};GENERAL=${general}`);\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hexToAscii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            //CustomID is not provided so far with command type 03\\r\\n                            /*if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }*/\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hexToAscii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // Auxiliary functions\\r\\n    function buildDataToReceiver(codeValues, configsToAck = [], configsToUpdate = [], configsToSend = []) {\\r\\n        const dataToReceiver = {\\r\\n            values: codeValues\\r\\n        };\\r\\n        if (configsToAck.length > 0) {\\r\\n            dataToReceiver.configsToAck = configsToAck;\\r\\n        }\\r\\n        if (configsToUpdate.length > 0) {\\r\\n            dataToReceiver.configsToUpdate = configsToUpdate;\\r\\n        }\\r\\n        if (configsToSend.length > 0) {\\r\\n            dataToReceiver.configsToSend = configsToSend;\\r\\n        }\\r\\n        return dataToReceiver;\\r\\n    }\\r\\n\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        var cvpair = {\\r\\n            code: p1,\\r\\n            value: p2\\r\\n        };\\r\\n        codeValueArray.push(cvpair);\\r\\n    }\\r\\n    // convert functions\\r\\n    function asciiToHex(str) { // ascii to hex \\r\\n        return [...str].map(char => char.charCodeAt(0).toString(16).padStart(2, '0')).join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { // convierte una cadena hexadecimal en un array de bytes (number[])\\r\\n        const bytes = [];\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            const byte = parseInt(str.substring(i, i + 2), 16);\\r\\n            if (!isNaN(byte) && byte >= 0 && byte <= 255) {\\r\\n                bytes.push(byte);\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) {\\r\\n        return Number(x).toString(16).toUpperCase();\\r\\n    }\\r\\n\\r\\n    function hexToBin(hex) { //  convierte un valor hexadecimal a su representación binaria, y asegura que tenga al menos 8 bits \\r\\n        const bin = parseInt(hex, 16).toString(2);\\r\\n        return bin.padStart(hex.length * 4, '0');\\r\\n    }\\r\\n\\r\\n    function hexToAscii(hex) {\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hex.match(/.{2}/g).map(byte => String.fromCharCode(parseInt(byte, 16))).join('');\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 !== 0) {\\r\\n            hex = '0' + hex;\\r\\n        }\\r\\n        const num = parseInt(hex, 16);\\r\\n        const bits = hex.length * 4;\\r\\n        const maxVal = 2 ** bits;\\r\\n        return num >= maxVal / 2 ? num - maxVal : num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(hex) {\\r\\n        return parseInt(hex, 16);\\r\\n    }\\r\\n    // CheckSum and debug functions\\r\\n    function changeEndianness(hexString) { // changeEndianness\\r\\n        if (hexString.length === 0) { //if string is empty or not defined\\r\\n            return \\\"\\\";\\r\\n        }\\r\\n        if (hexString.length % 2 !== 0) {\\r\\n            throw new Error(\\\"Hex string length must be even\\\");\\r\\n        }\\r\\n        return hexString.match(/.{2}/g) // divide in bytes (2 chars)\\r\\n            .reverse() // reverse the order\\r\\n            .join('');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // calcula el CRC16 sobre una cadena hexadecimal y devuelve el valor con el endianness invertido\\r\\n        const bytes = byteStringToByteArray(payloadData);\\r\\n        const crc = crc16byte(bytes);\\r\\n        const hex = crc.toString(16).padStart(4, '0').toUpperCase();\\r\\n        return changeEndianness(hex);\\r\\n    }\\r\\n\\r\\n    function crc16byte(byteArray) { // calcula el CRC-16 sobre un array de bytes usando una tabla precalculada (crcTable)\\r\\n        let crc = 0x0000;\\r\\n        for (const byte of byteArray) {\\r\\n            if (byte < 0 || byte > 255 || !Number.isInteger(byte)) {\\r\\n                throw new RangeError(\\\"Invalid byte value in input array\\\");\\r\\n            }\\r\\n            const index = (byte ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[index] ^ (crc << 8);\\r\\n        }\\r\\n        return crc & 0xFFFF;\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n    /*\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to protocol-dev server the message ... ');  // port 5878\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5878, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5878, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }*/\\r\\n    function sendMessageToLocalhostNoWait(message) {\\r\\n        const server = localTesting ? '52.174.17.77' : '127.0.0.1';\\r\\n        //const port = localTesting ? '5878' : '';  //Protocol-dev\\r\\n        const port = '5678'; //acceptance-dev\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG] Sending message to test server:', message);\\r\\n        }\\r\\n        const client = net.createConnection(port, server, () => {\\r\\n            client.write(message);\\r\\n            client.end();\\r\\n        });\\r\\n        client.on('error', (err) => {\\r\\n            console.error(`[ERROR] Failed to send message to ${server}:${port}:`, err.message);\\r\\n        });\\r\\n        client.on('end', () => {\\r\\n            if (localTesting) {\\r\\n                console.debug('[DEBUG] Connection closed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1749108615},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 13/09/2025\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str) { // sends message to system, closing connection after\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('local testing - sending to acceptance server the message ... ');\\r\\n            console.log(str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var c = net.createConnection(5678, server);\\r\\n        c.on('error', function(error) {\\r\\n            c = net.createConnection(5678, server);\\r\\n        });\\r\\n        c.write(`${str}`);\\r\\n        c.end();\\r\\n    }\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1757762557},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 22/03/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('[sendMessageToLocalhostNoWait] local testing - sending to acceptance server');\\r\\n            console.log('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n        }\\r\\n        var client = net.createConnection(5678, server, function() { //acceptance server\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            console.error('[sendMessageToLocalhostNoWait] Connection to ' + server + ':5678 timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                console.error('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                console.error('[sendMessageToLocalhostNoWait] All ' + maxRetries + ' attempts failed. Message not delivered.');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            console.error('[sendMessageToLocalhostNoWait] Connection to ' + server + ':5678 failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                console.error('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                console.error('[sendMessageToLocalhostNoWait] All ' + maxRetries + ' attempts failed. Message not delivered.');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1774209455},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 01/04/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            console.log('[sendMessageToLocalhostNoWait] local testing - sending to acceptance server');\\r\\n            console.log('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5678';\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() { //acceptance server\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            if (localTesting) {\\r\\n                console.log('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            }\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                if (localTesting) {\\r\\n                    console.log('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                }\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            if (localTesting) {\\r\\n                console.log('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            }\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                if (localTesting) {\\r\\n                    console.log('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                }\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1775042492},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 09/04/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            messageForReceiver = (`ACCESSORY-UPDATE;${imei}-${value.substring(2, 14)};${timestamp};Button;battery=${batLevel},status=${flag};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1775726185},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/04/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            //var alarm = 'EBZI'; \\r\\n                            //var latitudeHex = '00';\\r\\n                            //var longitudeHex = '00';\\r\\n                            //var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var mac = value.substring(2, 14); // No hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100\\r\\n                            //location_time = timestamp;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            messageForReceiver = (`ACCESSORY-UPDATE;${imei}-${value.substring(2, 14)};${timestamp};Button;battery=${batLevel},status=${flag};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1776191067},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 27/04/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var macRaw = value.substring(2, 14); // No need to flip it\\r\\n                            // add : format in MAC\\r\\n                            var mac = macRaw.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100, 255 = invalid / unknown\\r\\n                            var isValidBattery = batLevel >= 0 && batLevel <= 100;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            // Build accessory update.\\r\\n                            // If battery is invalid (>100, e.g. 0xFF), do NOT send battery field.\\r\\n                            // This allows the receiver to keep the last known valid battery value.\\r\\n                            var accessoryParams = [];\\r\\n                            if (isValidBattery) {\\r\\n                                accessoryParams.push(`battery=${batLevel}`);\\r\\n                            }\\r\\n                            accessoryParams.push(`status=${flag}`);\\r\\n                            messageForReceiver = `ACCESSORY-UPDATE;${imei}-${macRaw};${timestamp};Button;${accessoryParams.join(',')};`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1777307253},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 05/06/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon is detected and it isn't flic BLE detected\\r\\n        if (((params.beacon_data) && (params.beacon_data !== '')) && !((params.ble_data) && (params.ble_data !== ''))) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            //var label = gen_location[3];\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            //AddValue(codeValues,'location_accuracy', '3'); // para mostrar que si hay accuracy muestra como source GPS\\r\\n            // AddValue(codeValues,'beacon_mac', mac);\\r\\n            //AddValue(codeValues,'beacon_major', 0);\\r\\n            //AddValue(codeValues,'beacon_minor', 0);\\r\\n            //<<beacon_mac>>,<<beacon_major>>,<<beacon_minor>>  \\r\\n            if (mac2) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                var simpleQuery2 = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac2,\\r\\n                }];\\r\\n                var simpleQueryLabel2 = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery2\\r\\n                };\\r\\n                var labels2 = [];\\r\\n                labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            //AddValue(codeValues,'oysta_labels', label);\\r\\n            //AddValue(codeValues,'oysta_value', mac);\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var macRaw = value.substring(2, 14); // No need to flip it\\r\\n                            // add : format in MAC\\r\\n                            var mac = macRaw.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100, 255 = invalid / unknown\\r\\n                            var isValidBattery = batLevel >= 0 && batLevel <= 100;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            // Build accessory update.\\r\\n                            // If battery is invalid (>100, e.g. 0xFF), do NOT send battery field.\\r\\n                            // This allows the receiver to keep the last known valid battery value.\\r\\n                            var accessoryParams = [];\\r\\n                            if (isValidBattery) {\\r\\n                                accessoryParams.push(`battery=${batLevel}`);\\r\\n                            }\\r\\n                            accessoryParams.push(`status=${flag}`);\\r\\n                            messageForReceiver = `ACCESSORY-UPDATE;${imei}-${macRaw};${timestamp};Button;${accessoryParams.join(',')};`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                if (key == 'F0') { // Battery low (<40) when executing OTA\\r\\n                    event_time = moment.utc().unix();\\r\\n                    messageForReceiver = (`Roam-OBTL;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                    configsToAck.push(configIds.Controls.FirmwareUpgrade);\\r\\n                }\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1780680404},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 05/06/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon (iBeacon) is detected, always process it for location mapping\\r\\n        var beaconDataProcessed = false;\\r\\n        if ((params.beacon_data) && (params.beacon_data !== '')) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            beaconDataProcessed = true;\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            // Only use BLE MAC for beacon lookup if no iBeacon data was already processed\\r\\n            if (!beaconDataProcessed) {\\r\\n                if (mac2) {\\r\\n                    AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                    var simpleQuery2 = [{\\r\\n                        'code': 'Mac',\\r\\n                        'value': mac2,\\r\\n                    }];\\r\\n                    var simpleQueryLabel2 = {\\r\\n                        'table': 'beacons',\\r\\n                        'select': 'Name',\\r\\n                        'query': simpleQuery2\\r\\n                    };\\r\\n                    var labels2 = [];\\r\\n                    labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                    AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n                }\\r\\n                if (params.beacon_major) {\\r\\n                    AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_major', 0);\\r\\n                }\\r\\n                if (params.beacon_minor) {\\r\\n                    AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_minor', 0);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            //gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var macRaw = value.substring(2, 14); // No need to flip it\\r\\n                            // add : format in MAC\\r\\n                            var mac = macRaw.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100, 255 = invalid / unknown\\r\\n                            var isValidBattery = batLevel >= 0 && batLevel <= 100;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            // Build accessory update.\\r\\n                            // If battery is invalid (>100, e.g. 0xFF), do NOT send battery field.\\r\\n                            // This allows the receiver to keep the last known valid battery value.\\r\\n                            var accessoryParams = [];\\r\\n                            if (isValidBattery) {\\r\\n                                accessoryParams.push(`battery=${batLevel}`);\\r\\n                            }\\r\\n                            accessoryParams.push(`status=${flag}`);\\r\\n                            messageForReceiver = `ACCESSORY-UPDATE;${imei}-${macRaw};${timestamp};Button;${accessoryParams.join(',')};`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                if (key == 'F0') { // Battery low (<40) when executing OTA\\r\\n                    event_time = moment.utc().unix();\\r\\n                    messageForReceiver = (`Roam-OBTL;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                    configsToAck.push(configIds.Controls.FirmwareUpgrade);\\r\\n                }\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1782757627},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 14/09/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon (iBeacon) is detected, always process it for location mapping\\r\\n        var beaconDataProcessed = false;\\r\\n        if ((params.beacon_data) && (params.beacon_data !== '')) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            beaconDataProcessed = true;\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            // Only use BLE MAC for beacon lookup if no iBeacon data was already processed\\r\\n            if (!beaconDataProcessed) {\\r\\n                if (mac2) {\\r\\n                    AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                    var simpleQuery2 = [{\\r\\n                        'code': 'Mac',\\r\\n                        'value': mac2,\\r\\n                    }];\\r\\n                    var simpleQueryLabel2 = {\\r\\n                        'table': 'beacons',\\r\\n                        'select': 'Name',\\r\\n                        'query': simpleQuery2\\r\\n                    };\\r\\n                    var labels2 = [];\\r\\n                    labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                    AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n                }\\r\\n                if (params.beacon_major) {\\r\\n                    AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_major', 0);\\r\\n                }\\r\\n                if (params.beacon_minor) {\\r\\n                    AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_minor', 0);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var macRaw = value.substring(2, 14); // No need to flip it\\r\\n                            // add : format in MAC\\r\\n                            var mac = macRaw.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100, 255 = invalid / unknown\\r\\n                            var isValidBattery = batLevel >= 0 && batLevel <= 100;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            // Build accessory update.\\r\\n                            // If battery is invalid (>100, e.g. 0xFF), do NOT send battery field.\\r\\n                            // This allows the receiver to keep the last known valid battery value.\\r\\n                            var accessoryParams = [];\\r\\n                            if (isValidBattery) {\\r\\n                                accessoryParams.push(`battery=${batLevel}`);\\r\\n                            }\\r\\n                            accessoryParams.push(`status=${flag}`);\\r\\n                            messageForReceiver = `ACCESSORY-UPDATE;${imei}-${macRaw};${timestamp};Button;${accessoryParams.join(',')};`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Firmware version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1A':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                if (key == 'F0') { // Battery low (<40) when executing OTA\\r\\n                    event_time = moment.utc().unix();\\r\\n                    messageForReceiver = (`Roam-OBTL;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                    configsToAck.push(configIds.Controls.FirmwareUpgrade);\\r\\n                }\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1789381169},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 27/09/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon (iBeacon) is detected, always process it for location mapping\\r\\n        var beaconDataProcessed = false;\\r\\n        if ((params.beacon_data) && (params.beacon_data !== '')) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            beaconDataProcessed = true;\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            // Only use BLE MAC for beacon lookup if no iBeacon data was already processed\\r\\n            if (!beaconDataProcessed) {\\r\\n                if (mac2) {\\r\\n                    AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                    var simpleQuery2 = [{\\r\\n                        'code': 'Mac',\\r\\n                        'value': mac2,\\r\\n                    }];\\r\\n                    var simpleQueryLabel2 = {\\r\\n                        'table': 'beacons',\\r\\n                        'select': 'Name',\\r\\n                        'query': simpleQuery2\\r\\n                    };\\r\\n                    var labels2 = [];\\r\\n                    labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                    AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n                }\\r\\n                if (params.beacon_major) {\\r\\n                    AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_major', 0);\\r\\n                }\\r\\n                if (params.beacon_minor) {\\r\\n                    AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_minor', 0);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var macRaw = value.substring(2, 14); // No need to flip it\\r\\n                            // add : format in MAC\\r\\n                            var mac = macRaw.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100, 255 = invalid / unknown\\r\\n                            var isValidBattery = batLevel >= 0 && batLevel <= 100;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            // Build accessory update.\\r\\n                            // If battery is invalid (>100, e.g. 0xFF), do NOT send battery field.\\r\\n                            // This allows the receiver to keep the last known valid battery value.\\r\\n                            var accessoryParams = [];\\r\\n                            if (isValidBattery) {\\r\\n                                accessoryParams.push(`battery=${batLevel}`);\\r\\n                            }\\r\\n                            accessoryParams.push(`status=${flag}`);\\r\\n                            messageForReceiver = `ACCESSORY-UPDATE;${imei}-${macRaw};${timestamp};Button;${accessoryParams.join(',')};`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            // Software version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                        case '1A': // FW version\\r\\n                            //no ACK need\\r\\n                            var fwVersionL = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersionL\\\", fwVersionL);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersionLong, fwVersionL);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersionLong);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            let mode;\\r\\n                            if (value === \\\"04\\\") {\\r\\n                                mode = \\\"Roam\\\";\\r\\n                            } else if (value === \\\"64\\\") {\\r\\n                                mode = \\\"Sentry\\\";\\r\\n                            } else {\\r\\n                                mode = \\\"Rio\\\";\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", value);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, value);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                if (key == 'F0') { // Battery low (<40) when executing OTA\\r\\n                    event_time = moment.utc().unix();\\r\\n                    messageForReceiver = (`Roam-OBTL;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                    configsToAck.push(configIds.Controls.FirmwareUpgrade);\\r\\n                }\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1790531826},{"Type":1,"NewValue":"{\"Id\":313,\"Name\":\"Access TEC Roam\",\"Operation\":\"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    //\\r\\n    // Roam protocol - please see variables and typical values in order below\\r\\n    // TECRoam-CYC;<<imei>>;STATUS=<<status_data>>;LTIME=<<location_time>>;ETIME=<<event_time>>;BATP=<<battery_percentage>>;LGPS=<<gps_data>>;LWIF=<<wifi_data>>;LLBS=<<lbs_data>>;LBEACON=<<beacon_data>>;BLE=<<ble_data>>;SIGNAL=<<signal_strength>>;WM=<<work_mode>>;GENERAL=<<general>>\\r\\n    // TECRoam-CYC;861629050193550;STATUS=WIFISource,CellTower;TIME=1673950279;BATP=84;LGPS=undefined;LWIF=-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369;LLBS=214,1,13,768,38529798;LBEACON=undefined;BLE=undefined;GENERAL=statusDevice:WIFISource,CellTower,battery:84,cellNetworkSignal:14,workMode:6,wifiTowers:-54,286F7F3C8EB0,-68,4448B9848AD0,-78,00BF77E05369,214,1,13,768,38529798,;\\\",\\r\\n    //\\r\\n    // Author: Juanmi Navarro\\r\\n    // Created: 01/01/2025\\r\\n    // Last modified: 27/09/2026\\r\\n    //\\r\\n    ///////////////////////////////////////////////////////////////////////////////\\r\\n    if (typeof localTesting === \\\"undefined\\\") {\\r\\n        var localTesting = false;\\r\\n    }\\r\\n    const crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\\r\\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\\r\\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\\r\\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\\r\\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\\r\\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\\r\\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\\r\\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\\r\\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\\r\\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\\r\\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\\r\\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\\r\\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\\r\\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\\r\\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\\r\\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\\r\\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\\r\\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\\r\\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\\r\\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\\r\\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\\r\\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n    ];\\r\\n    var codeValues = [];\\r\\n    AddValue(codeValues, 'protocol_template', 'Roam');\\r\\n    AddValue(codeValues, 'product', serverParams.ProductName);\\r\\n    var dataToReceiver = [];\\r\\n    var configsToAck = [];\\r\\n    var configsToUpdate = [];\\r\\n    var configsToSend = [];\\r\\n    if (globalTemplate == \\\"True\\\") {\\r\\n        if (raw.startsWith('esendex')) {\\r\\n            AddValue(codeValues, 'rawMsg', raw);\\r\\n            //general SMS message\\r\\n            messageForReceiver = (`Roam-SMS;${serverParams.Imei};${raw}`);\\r\\n            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n            return;\\r\\n        }\\r\\n        //AddValue(codeValues, 'raw', raw);\\r\\n        //AddValue(codeValues, 'rawMsg', rawFromBytes);\\r\\n        var event_time, location_time, location_accuracy, speed, fix_state, latitude, longitude;\\r\\n        var homeBeacon = '';\\r\\n        var homeWiFi = '';\\r\\n        var contacts = '';\\r\\n        var gps_data = '';\\r\\n        var wifi_data = '';\\r\\n        var status_data = '';\\r\\n        var lbs_data = '';\\r\\n        var beacon_data = '';\\r\\n        var ble_data = '';\\r\\n        var smart_data = '';\\r\\n        //parse header & properties\\r\\n        //var message = rawFromBytes;\\r\\n        //var properties = message.substring(2, 4);\\r\\n        //var lengthLittleEndian = message.substring(4, 8);\\r\\n        //var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        //total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        //var sequenceID = message.substring(12, 16);\\r\\n        //var command = message.substring(16, 18);\\r\\n        //var index = 18;\\r\\n        var messageForReceiver;\\r\\n        var prefix = 'AB' + '00';\\r\\n        var lengthAck = 0;\\r\\n        var ack = '';\\r\\n        var needsAck = false;\\r\\n        var hasConfigs = false;\\r\\n        var general = '';\\r\\n        var timestamp = '';\\r\\n        var info = '';\\r\\n        var customID = '';\\r\\n        latitude = 0;\\r\\n        longitude = 0;\\r\\n        location_accuracy = 0; // GPS location adds the accuracy\\r\\n        location_time = event_time = '';\\r\\n        speed = 0.0;\\r\\n        var location_type = '0';\\r\\n        //var gen_location = '0'; \\r\\n        var i; // general loop counter\\r\\n        var battery_percentage = '';\\r\\n        var cellNetworkSignal = '';\\r\\n        var workMode = '';\\r\\n        var message = rawFromBytes;\\r\\n        debug(message);\\r\\n        decodeHexStream(message);\\r\\n        /*mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) { // 22/7 change ((parseInt(properties) & 16) == 16)\\r\\n            needsAck = true;\\r\\n        }\\r\\n        // Loop to decode multi-ACK msg\\r\\n        if (message.includes('AB00030008C7')) {\\r\\n            const multiack = message.split('AB00');\\r\\n            for (let i = 1; i < multiack.length; i++) {\\r\\n                message = 'AB00' + multiack[i];\\r\\n                debug(message);\\r\\n                decoder(message);\\r\\n            } // FOR multiACK\\r\\n        } else decoder(message); // IF multiACK */\\r\\n    } else if (oystaTemplate == 'True') { // Oysta Template \\r\\n        // first decoding data of Oysta templates\\r\\n        AddValue(codeValues, 'rawMsg', raw);\\r\\n        if ((params.gps_data) && (params.gps_data !== '')) { // decode gps data if exists\\r\\n            var gen_location = params.gps_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var location_accuracy = gen_location[2];\\r\\n            var speed = gen_location[3];\\r\\n            var direction = gen_location[4];\\r\\n            var altitude = gen_location[5];\\r\\n            var satellites = gen_location[6];\\r\\n            var mileage = gen_location[7];\\r\\n            if (location_accuracy !== 0) {\\r\\n                var fix_state = 1;\\r\\n            } else {\\r\\n                var fix_state = 0;\\r\\n            }\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            AddValue(codeValues, 'speed', speed);\\r\\n            AddValue(codeValues, 'direction', direction);\\r\\n            AddValue(codeValues, 'altitude', altitude);\\r\\n            AddValue(codeValues, 'location_accuracy', location_accuracy);\\r\\n            AddValue(codeValues, 'mileage', mileage);\\r\\n            AddValue(codeValues, 'satellites', satellites);\\r\\n            AddValue(codeValues, 'fix_state', fix_state);\\r\\n        }\\r\\n        if ((params.lbs_data) && (params.lbs_data !== '')) { // decode lbs data if exists\\r\\n            var variables = []; //Define array\\r\\n            variables = params.lbs_data.split(',');\\r\\n            var index = 2;\\r\\n            for (i = 0; i < ((variables.length - 2) / 3); i++) { //loop for number of LBS sets on incoming data.\\r\\n                if (variables[i] !== '0') { //Check if LBS data is present (device sends 0 if data not present)/actually exists.\\r\\n                    AddValue(codeValues, 'mcc', variables[0]);\\r\\n                    AddValue(codeValues, 'mnc', variables[1]);\\r\\n                    AddValue(codeValues, 'lac', variables[index]);\\r\\n                    AddValue(codeValues, 'signal_lbs', variables[index + 1]);\\r\\n                    AddValue(codeValues, 'cellid', variables[index + 2]);\\r\\n                }\\r\\n                index += 3;\\r\\n            }\\r\\n        }\\r\\n        if ((params.wifi_data) && (params.wifi_data !== '')) { // decode wifi data if exists\\r\\n            var bssid_array = params.wifi_data.split(',');\\r\\n            var index = 0;\\r\\n            for (let i = 0; i < (bssid_array.length / 2); i++) {\\r\\n                if (bssid_array[index + 1] != '000000000000') { //Check if MAC address is not 000000000000 - seems to be the default MAC of the device itself\\r\\n                    AddValue(codeValues, 'bssid', bssid_array[index + 1]);\\r\\n                    AddValue(codeValues, 'signal_wifi', bssid_array[index]);\\r\\n                }\\r\\n                index += 2;\\r\\n            }\\r\\n        }\\r\\n        //  when Beacon (iBeacon) is detected, always process it for location mapping\\r\\n        var beaconDataProcessed = false;\\r\\n        if ((params.beacon_data) && (params.beacon_data !== '')) {\\r\\n            var gen_location = params.beacon_data.split(',');\\r\\n            var latitude = gen_location[0];\\r\\n            var longitude = gen_location[1];\\r\\n            var mac = gen_location[2];\\r\\n            var label = gen_location[3];\\r\\n            AddValue(codeValues, 'latitude', latitude);\\r\\n            AddValue(codeValues, 'longitude', longitude);\\r\\n            if (mac) {\\r\\n                AddValue(codeValues, 'beacon_mac', mac);\\r\\n                var simpleQuery = [{\\r\\n                    'code': 'Mac',\\r\\n                    'value': mac,\\r\\n                }];\\r\\n                var simpleQueryLabel = {\\r\\n                    'table': 'beacons',\\r\\n                    'select': 'Name',\\r\\n                    'query': simpleQuery\\r\\n                };\\r\\n                var labels = [];\\r\\n                labels.push(JSON.stringify(simpleQueryLabel));\\r\\n                AddValue(codeValues, 'oysta_labels', JSON.stringify(labels));\\r\\n            }\\r\\n            if (params.beacon_major) {\\r\\n                AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_major', 0);\\r\\n            }\\r\\n            if (params.beacon_minor) {\\r\\n                AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'beacon_minor', 0);\\r\\n            }\\r\\n            beaconDataProcessed = true;\\r\\n        }\\r\\n        if ((params.ble_data) && (params.ble_data !== '')) { // decode ble data if exists\\r\\n            var gen_location = params.ble_data.split(',');\\r\\n            var flag = gen_location[0] || \\\"undefined\\\";\\r\\n            var batLevel = gen_location[1] || \\\"undefined\\\";\\r\\n            var mac2 = gen_location[2] || \\\"undefined\\\";\\r\\n            AddValue(codeValues, 'flagBLE', flag);\\r\\n            AddValue(codeValues, 'batBLE', batLevel);\\r\\n            // Only use BLE MAC for beacon lookup if no iBeacon data was already processed\\r\\n            if (!beaconDataProcessed) {\\r\\n                if (mac2) {\\r\\n                    AddValue(codeValues, 'beacon_mac', mac2);\\r\\n                    var simpleQuery2 = [{\\r\\n                        'code': 'Mac',\\r\\n                        'value': mac2,\\r\\n                    }];\\r\\n                    var simpleQueryLabel2 = {\\r\\n                        'table': 'beacons',\\r\\n                        'select': 'Name',\\r\\n                        'query': simpleQuery2\\r\\n                    };\\r\\n                    var labels2 = [];\\r\\n                    labels2.push(JSON.stringify(simpleQueryLabel2));\\r\\n                    AddValue(codeValues, 'oysta_labels', JSON.stringify(labels2));\\r\\n                }\\r\\n                if (params.beacon_major) {\\r\\n                    AddValue(codeValues, 'beacon_major', params.beacon_major);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_major', 0);\\r\\n                }\\r\\n                if (params.beacon_minor) {\\r\\n                    AddValue(codeValues, 'beacon_minor', params.beacon_minor);\\r\\n                } else {\\r\\n                    AddValue(codeValues, 'beacon_minor', 0);\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n        /*  meter mas tarde...   \\r\\n            if (params.smart_data !== 'undefined') {\\r\\n                var gen_location = params.smart_data.split(',')\\r\\n                var latitude = gen_location[0]\\r\\n                var longitude = gen_location[1]\\r\\n                var location_accuracy = gen_location[2]\\r\\n                var altitude = gen_location[3]\\r\\n                AddValue(codeValues,'latitude', latitude);\\r\\n                AddValue(codeValues,'longitude', longitude);\\r\\n                AddValue(codeValues,'altitude', altitude);\\r\\n                AddValue(codeValues,'location_accuracy', location_accuracy);\\r\\n            }\\r\\n          */\\r\\n        /*else if ((params.event_time) && (params.event_time == '')) {\\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues,'event_time', event_time);\\r\\n        }  revisar mas adelante*/\\r\\n        if (params.location_time) {\\r\\n            AddValue(codeValues, 'location_time', params.location_time);\\r\\n        }\\r\\n        if (params.event_time) {\\r\\n            AddValue(codeValues, 'event_time', params.event_time);\\r\\n        }\\r\\n        // to parse SMS info from the device\\r\\n        switch (messageTypeLocalCode) {\\r\\n            case 'COMM-SMS': // SMS message sent in\\r\\n                if (params.data.startsWith('Device location request')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('IMEI:')) {\\r\\n                    configsToAck.push(configIds.Controls.GetFirmwareVersion);\\r\\n                } else if (params.data.startsWith('Set IP ok')) {\\r\\n                    configsToAck.push(configIds.Controls.ClearBufferedMessages);\\r\\n                } else if (params.data.startsWith('flush ok')) {\\r\\n                    configsToAck.push(configIds.Controls.GetCurrentConfig);\\r\\n                } else if (params.data.startsWith('Set Roam-')) {\\r\\n                    configsToAck.push(configIds.SMSPrefix.SMSPrefix);\\r\\n                } else if (params.data.startsWith('set live tracking')) {\\r\\n                    configsToAck.push(configIds.Controls.Trace);\\r\\n                } else if (params.data.startsWith('reboot ok')) {\\r\\n                    configsToAck.push(configIds.Controls.Reboot);\\r\\n                } else if (params.data.startsWith('GPS')) {\\r\\n                    configsToAck.push(configIds.Controls.RealTimeLocate);\\r\\n                    var i1 = params.data.search('Now:')\\r\\n                    var i2 = params.data.search('Loc Time:')\\r\\n                    var i3 = params.data.search('Speed:')\\r\\n                    var i4 = params.data.search('Altitude:')\\r\\n                    var i5 = params.data.search('Battery:')\\r\\n                    var i6 = params.data.search('google')\\r\\n                    var eventTime = params.data.substring(i2 + 9, i3)\\r\\n                    var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                    if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                        Speed = Speed * 0.44704\\r\\n                    } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                        Speed = Speed / 3.6\\r\\n                    }\\r\\n                    var latlong = params.data.substring(i6 + 18)\\r\\n                    location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    //event_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                    //messageForReceiver = (`CARE-RTL;${params.imei};${event_time};${event_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                break;\\r\\n            case 'ACK-FIRM-SMS': // Firmware info sent by SMS\\r\\n                //var i1 = params.data.search('IMEI:')\\r\\n                //var i2 = params.data.search('GSM signal quality:')\\r\\n                var i3 = params.data.search('Software version:')\\r\\n                var sub = params.data.substring(i3 + 17, params.data.length)\\r\\n                var i4 = sub.search('version:');\\r\\n                var fwVersion = sub.substring(i4, sub.length);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                break;\\r\\n            case 'ACK-FALLSENS-SMS': // Fall sensibility info sent by SMS\\r\\n                var i1 = params.data.search('Fall alarm:');\\r\\n                var sensibility = params.data.substring(i1 + 11, i1 + 14);\\r\\n                var i2 = params.data.search('level:');\\r\\n                sensibility = sensibility + ', ' + params.data.substring(i2 + 6, i2 + 7);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                AddValue(configsToUpdate, configIds.ReadEmergencySettings.FallSensitivity, sensibility);\\r\\n                configsToAck.push(configIds.ReadEmergencySettings.FallSensitivity);\\r\\n                break;\\r\\n            case 'ACK-BEAC-SMS': // Beacon list info sent by SMS\\r\\n                var i1 = raw.search('1,');\\r\\n                //var i2 = params.data.search('2,');\\r\\n                //var homeBeacon = params.data.substring(i1+2, i2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                AddValue(codeValues, \\\"homeBeacon\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                break;\\r\\n            case 'ACK-CONTAC-SMS': // Contact list info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = raw.search('A1:');\\r\\n                if (raw.includes('A2:')) {\\r\\n                    var i2 = raw.search('A2:');\\r\\n                } else {\\r\\n                    var i2 = raw.search('A10:');\\r\\n                }\\r\\n                var tel = raw.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                i2 = raw.search('A10:')\\r\\n                tel = raw.substring(i2 + 4, raw.length);\\r\\n                AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                AddValue(codeValues, \\\"ApprovedContacts\\\", raw.substring(i1, raw.length));\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, raw.substring(i1, raw.length));\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                break;\\r\\n            case 'ACK-SERV-SMS': // APN and Server info sent by SMS\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                var i1 = params.data.search('APN:')\\r\\n                var i2 = params.data.search('IP:')\\r\\n                var i3 = params.data.search('Move')\\r\\n                var apn = params.data.substring(i1 + 4, i2);\\r\\n                AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                var serverDetails = params.data.substring(i2 + 3, i3);\\r\\n                AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n            case 'RTL-GPS': // SRTL sent in via SMS with no pre-code\\r\\n                var i3 = params.data.search('Speed:')\\r\\n                var i4 = params.data.search('Altitude:')\\r\\n                var i5 = params.data.search('Battery:')\\r\\n                var i6 = params.data.search('google')\\r\\n                var eventTime = params.data.substring(0, i3)\\r\\n                var Speed = params.data.substring(i3 + 6, i4 - 3)\\r\\n                if (params.data.substring(i4 - 3, i4) == 'mph') {\\r\\n                    Speed = Speed * 0.44704\\r\\n                } else if (params.data.substring(i4 - 3, i4) == 'kph') {\\r\\n                    Speed = Speed / 3.6\\r\\n                }\\r\\n                var latlong = params.data.substring(i6 + 18)\\r\\n                location_time = moment(eventTime, 'MM/DD/YYYY HH:mm:ss').unix()\\r\\n                messageForReceiver = (`Roam-RTL;${params.imei};${location_time};${location_time};${latlong.split(',')[0]};${latlong.split(',')[1]};9000;${params.data.substring(i4+9,i5)};${Speed};${params.data.substring(i5+8,i6-5)};`);\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                break;\\r\\n        }\\r\\n        /*if (!params.event_time && !event_time) { // if params.event_time undefined - set it to now. \\r\\n            var event_time = moment.utc().unix();\\r\\n            AddValue(codeValues, 'event_time', event_time);\\r\\n        }\\r\\n        // if (!params.location_time && !location_time) { // if params.location_time undefined - set it to now. \\r\\n        //    var location_time = moment.utc().unix();\\r\\n        //    AddValue(codeValues, 'location_time', location_time);\\r\\n        //}*/\\r\\n    }\\r\\n    // send data msg to kibana\\r\\n    var dataToReceiver = {\\r\\n        'values': codeValues\\r\\n    };\\r\\n    if (configsToAck.length > 0) {\\r\\n        dataToReceiver.configsToAck = configsToAck\\r\\n    };\\r\\n    if (configsToUpdate.length > 0) {\\r\\n        dataToReceiver.configsToUpdate = configsToUpdate\\r\\n    };\\r\\n    if (configsToSend.length > 0) {\\r\\n        dataToReceiver.configsToSend = configsToSend\\r\\n    };\\r\\n    console.log(dataToReceiver);\\r\\n    // modify to return the object that contains your data\\r\\n    return dataToReceiver;\\r\\n    // end of main operation\\r\\n    // define functions used in operation\\r\\n    // decode global msg\\r\\n    function decoder(str) { // decode rawdata\\r\\n        // CARE Decoder\\r\\n        // AddValue(codeValues, 'Message : ', str);\\r\\n        var message = str;\\r\\n        var index = 18;\\r\\n        //parse header & properties\\r\\n        var properties = message.substring(2, 4);\\r\\n        var lengthLittleEndian = message.substring(4, 8);\\r\\n        var total_length = lengthLittleEndian.substring(2, 4) + lengthLittleEndian.substring(0, 2);\\r\\n        total_length = 2 * hexToDecimal(total_length.substring(0, 4));\\r\\n        var sequenceID = message.substring(12, 16);\\r\\n        var command = message.substring(16, 18);\\r\\n        //mask bitwise   (properties should be '10')\\r\\n        if ((parseInt(properties) & 8) == 8) {\\r\\n            needsAck = true;\\r\\n        } else needsAck = false;\\r\\n        // need to check if checksum is correct for possible msg corruption  10/03/23\\r\\n        var checksum = message.substring(8, 12);\\r\\n        var messageBody = message.substring(16, message.length);\\r\\n        debug('message =' + message);\\r\\n        debug('checksum =' + checksum);\\r\\n        debug('calculateCheckSum =' + calculateCheckSum(messageBody));\\r\\n        if (calculateCheckSum(messageBody) == checksum) { // payload is valid\\r\\n            debug(\\\"message has valid checksum\\\");\\r\\n            var messageBody = command; // update value for the ACK\\r\\n            debug('command =' + command);\\r\\n            if (command == '01') {\\r\\n                while (index < total_length + 16) {\\r\\n                    // gen_location = '0'; //cambiado 30/09\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        //Device ID\\r\\n                        case '01':\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            break;\\r\\n                            //Alarm code\\r\\n                        case '02':\\r\\n                            var alarm = 'CYC';\\r\\n                            var alarmCode = value.substring(0, 8);\\r\\n                            alarmCode = changeEndianness(alarmCode);\\r\\n                            var timestampHex = value.substring(8, 16);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            event_time = timestamp;\\r\\n                            var alarmCodeInt = hexToDecimal(alarmCode);\\r\\n                            var alarmCodeExt = value.substring(16, 24);\\r\\n                            alarmCodeExt = changeEndianness(alarmCodeExt);\\r\\n                            var alarmCodeExtInt = hexToDecimal(alarmCodeExt);\\r\\n                            //Extended Alerts\\r\\n                            // Fall off\\r\\n                            if ((alarmCodeExtInt & 1) == 1) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // Welfare Check-out\\r\\n                            else if ((alarmCodeExtInt & 2) == 2) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Standard Alerts\\r\\n                            //Battery low\\r\\n                            else if ((alarmCodeInt & 1) == 1) {\\r\\n                                var alarm = 'BATL';\\r\\n                            }\\r\\n                            //Overspeed\\r\\n                            else if ((alarmCodeInt & 2) == 2) {\\r\\n                                var alarm = 'ALSP';\\r\\n                            }\\r\\n                            //Fall\\r\\n                            else if ((alarmCodeInt & 4) == 4) {\\r\\n                                var alarm = 'ALF';\\r\\n                            }\\r\\n                            //Tilt\\r\\n                            else if ((alarmCodeInt & 8) == 8) {\\r\\n                                var alarm = 'Tilt';\\r\\n                                // Geo IN - OUT    \\r\\n                            } else if ((alarmCodeInt & 16) == 16) {\\r\\n                                if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                                    var alarm = 'Geo1-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo1-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 32) == 32) {\\r\\n                                if ((alarmCodeInt & 33554432) == 33554432) {\\r\\n                                    var alarm = 'Geo2-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo2-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 64) == 64) {\\r\\n                                if ((alarmCodeInt & 67108864) == 67108864) {\\r\\n                                    var alarm = 'Geo3-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo3-OUT';\\r\\n                                }\\r\\n                            } else if ((alarmCodeInt & 128) == 128) {\\r\\n                                if ((alarmCodeInt & 134217728) == 134217728) {\\r\\n                                    var alarm = 'Geo4-IN';\\r\\n                                } else {\\r\\n                                    var alarm = 'Geo4-OUT';\\r\\n                                }\\r\\n                            }\\r\\n                            //Power Off\\r\\n                            else if ((alarmCodeInt & 256) == 256) {\\r\\n                                var alarm = 'PWRF';\\r\\n                            }\\r\\n                            //Power On\\r\\n                            else if ((alarmCodeInt & 512) == 512) {\\r\\n                                var alarm = 'PWRN';\\r\\n                            }\\r\\n                            //Motion\\r\\n                            else if ((alarmCodeInt & 1024) == 1024) {\\r\\n                                var alarm = 'ALMOV';\\r\\n                            }\\r\\n                            //No Motion\\r\\n                            else if ((alarmCodeInt & 2048) == 2048) {\\r\\n                                var alarm = 'ALNM';\\r\\n                            }\\r\\n                            //SOS\\r\\n                            else if ((alarmCodeInt & 4096) == 4096) {\\r\\n                                var alarm = 'ALSOS';\\r\\n                            } else if ((alarmCodeInt & 8192) == 8192) {\\r\\n                                var alarm = 'Side1';\\r\\n                            } else if ((alarmCodeInt & 16384) == 16384) {\\r\\n                                var alarm = 'Side2';\\r\\n                            }\\r\\n                            //Battery charging\\r\\n                            else if ((alarmCodeInt & 32768) == 32768) {\\r\\n                                var alarm = 'BATCN';\\r\\n                            }\\r\\n                            //Battery no charging\\r\\n                            else if ((alarmCodeInt & 65536) == 65536) {\\r\\n                                var alarm = 'BATCF';\\r\\n                            }\\r\\n                            //Alarm end\\r\\n                            else if ((alarmCodeInt & 131072) == 131072) {\\r\\n                                var alarm = 'ALA-F';\\r\\n                                info = 'Alarm Finished';\\r\\n                            }\\r\\n                            //Amber Alert  EC03 only\\r\\n                            else if ((alarmCodeInt & 262144) == 262144) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // welfare Alert check-in ALA-O\\r\\n                            else if ((alarmCodeInt & 524288) == 524288) {\\r\\n                                var alarm = 'ALA-O';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                                var alarm = 'ALA-C';\\r\\n                            }\\r\\n                            // Amber alert Ending  ALA-C\\r\\n                            //else if ((alarmCodeInt & 1048576) == 1048576) {\\r\\n                            //    var alarm = 'ALA-C';\\r\\n                            //}\\r\\n                            // Fall-Down Alert ending\\r\\n                            else if ((alarmCodeInt & 2097152) == 2097152) {\\r\\n                                var alarm = 'ALF-C';\\r\\n                            }\\r\\n                            // welfare Alert Ending  ALA\\r\\n                            else if ((alarmCodeInt & 4194304) == 4194304) {\\r\\n                                var alarm = 'ALA';\\r\\n                            }\\r\\n                            // Beacon absent Alert 11/10/22. Need to be added in msg types\\r\\n                            //else if ((alarmCodeInt & 16777216) == 16777216) {\\r\\n                            //    var alarm = 'BEA';\\r\\n                            //}\\r\\n                            general += 'alarm:' + alarm + ',';\\r\\n                            break;\\r\\n                            //Custom ID\\r\\n                        case '03':\\r\\n                            // in value is customID.... '06' for Watch Care\\r\\n                            // if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //update customID to check if belongs to this type of device\\r\\n                            customID = value;\\r\\n                            if (value != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                // exit decoder\\r\\n                                // const data = buildDataToReceiver(codeValues, configsToAck, configsToUpdate, configsToSend);\\r\\n                                // console.log(data);\\r\\n                                return // data\\r\\n                            } else {\\r\\n                                if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                    sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                    //return;\\r\\n                                }\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                general += 'customID:' + value + ',';\\r\\n                                break;\\r\\n                            }\\r\\n                            //Historical Data Completed\\r\\n                        case '10': // indica q se han terminado de enviar todos los datos historicos.\\r\\n                            var histData = true;\\r\\n                            break;\\r\\n                            //GPS location\\r\\n                        case '20':\\r\\n                            location_type = 'GPS';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var speedHex = value.substring(16, 20);\\r\\n                            var directionHex = value.substring(20, 24);\\r\\n                            var altitudeHex = value.substring(24, 28);\\r\\n                            var location_accuracyHex = value.substring(28, 32);\\r\\n                            var mileageHex = value.substring(32, 40);\\r\\n                            var satellitesHex = value.substring(40, 42);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            speed = ((hexToDecimal(changeEndianness(speedHex))) / 3.6).toFixed(2); //date 14-02-2023 in m/s\\r\\n                            var direction = hexToDecimal(changeEndianness(directionHex));\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex)); // in  meters\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            // Range: 0.5 to 99.9  \\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //var mileage = hexToDecimal(changeEndianness(mileageHex)) this is in km/h we need m/s\\r\\n                            var mileage = hexToDecimal(changeEndianness(mileageHex)); // in meters date 14-02-2023\\r\\n                            var satellites = hexToDecimal(satellitesHex);\\r\\n                            // location_time = timestamp;\\r\\n                            //<<latitude>>,<<longitude>>,<<speed>>,<<altitude>>,<<location_time>>\\r\\n                            gps_data = `${latitude},${longitude},${location_accuracy},${speed},${direction},${altitude},${satellites},${mileage}`;\\r\\n                            general += 'gps location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //WIFI Towers\\r\\n                        case '22':\\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            wifi_data = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                wifi_data += hexToDecimalSigned(wifiTowers.substring(indexWifi, indexWifi + 2)) + ',' + wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            wifi_data = wifi_data.slice(0, -1);\\r\\n                            general += wifi_data;\\r\\n                            break;\\r\\n                            //BLE Location  Added 10/10/22\\r\\n                        case '23':\\r\\n                            location_type = 'BLE';\\r\\n                            var mac = value.substring(0, 12);\\r\\n                            var latitudeHex = value.substring(12, 20);\\r\\n                            var longitudeHex = value.substring(20, 28);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var address = hex_to_ascii(value.substring(28, value.length));\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            // location_time = timestamp;\\r\\n                            ble_data = `${latitude},${longitude},${mac},${address}`;\\r\\n                            general += 'BLE location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //General Data ,  status_data\\r\\n                        case '24':\\r\\n                            //var general = 'true'\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //alarm = alarmCode = general = status_data = gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            }\\r\\n                            // reset variables\\r\\n                            alarm = alarmCode = general = status_data = '';\\r\\n                            gps_data = wifi_data = lbs_data = beacon_data = ble_data = '';\\r\\n                            var timestampHex = value.substring(0, 8);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            timestamp = hexToDecimal(timestampHex);\\r\\n                            // if timestamp is older than 1 year, update it (AGPS bug)\\r\\n                            if (timestamp < moment.utc().subtract(1, \\\"year\\\").unix()) {\\r\\n                                timestamp += 619315200; //moment.utc().unix();\\r\\n                            }\\r\\n                            location_time = timestamp;\\r\\n                            event_time = timestamp; //first it is initializated equal to status, but if alarm or other event, it is changed.\\r\\n                            var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                            var statusInt = hexToDecimal(statusHex);\\r\\n                            var statusDevice = '';\\r\\n                            if ((statusInt & 1) == 1) {\\r\\n                                statusDevice += 'GPS,';\\r\\n                            }\\r\\n                            if ((statusInt & 2) == 2) {\\r\\n                                statusDevice += 'WIFISource,';\\r\\n                            }\\r\\n                            if ((statusInt & 4) == 4) {\\r\\n                                statusDevice += 'CellTower,';\\r\\n                            }\\r\\n                            if ((statusInt & 8) == 8) {\\r\\n                                statusDevice += 'BLELocation,';\\r\\n                            }\\r\\n                            //params.BatteryStatus.BatteryStatus = '1';\\r\\n                            if ((statusInt & 16) == 16) {\\r\\n                                statusDevice += 'Charging,';\\r\\n                            }\\r\\n                            if ((statusInt & 32) == 32) {\\r\\n                                statusDevice += 'FUllyCharged,';\\r\\n                            }\\r\\n                            if ((statusInt & 64) == 64) {\\r\\n                                statusDevice += 'Reboot,';\\r\\n                            }\\r\\n                            if ((statusInt & 128) == 128) {\\r\\n                                statusDevice += 'HistoricalData,';\\r\\n                            }\\r\\n                            if ((statusInt & 256) == 256) {\\r\\n                                statusDevice += 'AGPSDataValid,';\\r\\n                            }\\r\\n                            if ((statusInt & 512) == 512) {\\r\\n                                statusDevice += 'Motion,';\\r\\n                            }\\r\\n                            if ((statusInt & 1024) == 1024) {\\r\\n                                statusDevice += 'SmartLocating,';\\r\\n                            }\\r\\n                            if ((statusInt & 2048) == 2048) { //isHome\\r\\n                                statusDevice += 'BeaconLocation,';\\r\\n                            }\\r\\n                            if ((statusInt & 4096) == 4096) {\\r\\n                                statusDevice += 'BLEConnected,';\\r\\n                            }\\r\\n                            if ((statusInt & 16384) == 16384) {\\r\\n                                statusDevice += 'HomeWiFi,';\\r\\n                            }\\r\\n                            statusDevice = statusDevice.slice(0, -1);\\r\\n                            status_data = statusDevice; //to oysta template\\r\\n                            //statusHex = (statusHex);\\r\\n                            statusHex = hex2bin(statusHex);\\r\\n                            statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                            battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                            cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                            workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                            general += 'statusDevice:' + statusDevice + ',';\\r\\n                            if (battery_percentage) {\\r\\n                                general += 'battery:' + battery_percentage + ',';\\r\\n                            }\\r\\n                            if (cellNetworkSignal) {\\r\\n                                general += 'cellNetworkSignal:' + cellNetworkSignal + ',';\\r\\n                            }\\r\\n                            if (workMode) {\\r\\n                                general += 'workMode:' + workMode + ',';\\r\\n                            }\\r\\n                            //messageForReceiver = (`CareWatch-CYC;${imei};${i};${event_time};${battery_percentage}`);\\r\\n                            break;\\r\\n                            //Call Records\\r\\n                        case '25':\\r\\n                            //Needed?\\r\\n                            break;\\r\\n                            //BLE Location 2\\r\\n                        case '26':\\r\\n                            //I don't understand\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Smart Location\\r\\n                        case '27':\\r\\n                            location_type = 'SMART';\\r\\n                            var latitudeHex = value.substring(0, 8);\\r\\n                            var longitudeHex = value.substring(8, 16);\\r\\n                            var location_accuracyHex = value.substring(16, 20);\\r\\n                            var altitudeHex = value.substring(20, 24);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            var altitude = hexToDecimal(changeEndianness(altitudeHex));\\r\\n                            //location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex)) * 5;\\r\\n                            //04/08/2022 se quita el multiplicador por 5 pq ya viene el valor en metros\\r\\n                            location_accuracy = hexToDecimal(changeEndianness(location_accuracyHex));\\r\\n                            //location_time = timestamp;\\r\\n                            smart_data = `${latitude},${longitude},${location_accuracy},${altitude}`;\\r\\n                            general += 'smart location (lat):' + latitude + ', (long):' + longitude + ',';\\r\\n                            break;\\r\\n                            //Beacon Location  Added 11/10/22\\r\\n                        case '28':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                                descr = hex_to_ascii(value.substring(34, value.length));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            // var latitudeHex = value.substring(18, 26);\\r\\n                            // var longitudeHex = value.substring(26, 34);\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            // Beacon V2\\r\\n                        case '2C':\\r\\n                            location_type = 'BEACON';\\r\\n                            // var alarm = 'EBZI';\\r\\n                            var latitudeHex = '00';\\r\\n                            var longitudeHex = '00';\\r\\n                            var descr = 'empty';\\r\\n                            var flag = hexToDecimal(value.substring(0, 1));\\r\\n                            var beacId = hexToDecimal(value.substring(1, 2));\\r\\n                            // msg includes descrip\\r\\n                            if ((flag & 4) == 4) {\\r\\n                                let desc_leng = hexToDecimal(value.substring(20, 22));\\r\\n                                descr = hex_to_ascii(value.substring(22, 22 + (2 * desc_leng)));\\r\\n                                //descr = hex_to_ascii(value.substring(18, value.length));\\r\\n                            }\\r\\n                            // msg includes lat/lon\\r\\n                            if ((flag & 8) == 8) {\\r\\n                                latitudeHex = value.substring(18, 26);\\r\\n                                longitudeHex = value.substring(26, 34);\\r\\n                            }\\r\\n                            // msg includes lat/lon and description\\r\\n                            if ((flag & 12) == 12) {\\r\\n                                latitudeHex = value.substring(20, 28);\\r\\n                                longitudeHex = value.substring(28, 36);\\r\\n                                let desc_leng = hexToDecimal(value.substring(36, 38));\\r\\n                                descr = hex_to_ascii(value.substring(38, 38 + (2 * desc_leng)));\\r\\n                            }\\r\\n                            var mac = changeEndianness(value.substring(2, 14)); // comprobar si hace falta darle la vuelta\\r\\n                            // add : format in MAC\\r\\n                            mac = mac.match(/.{1,2}/g).join(':');\\r\\n                            var rssiHex = value.substring(14, 16);\\r\\n                            var rssi1Hex = value.substring(16, 18);\\r\\n                            rssi = hexToDecimalSigned(changeEndianness(rssiHex));\\r\\n                            rssi1 = hexToDecimalSigned(changeEndianness(rssi1Hex));\\r\\n                            var battery_beacon = hexToDecimal(value.substring(18, 20));\\r\\n                            latitude = hexToDecimalSigned(changeEndianness(latitudeHex)) / 10000000;\\r\\n                            longitude = hexToDecimalSigned(changeEndianness(longitudeHex)) / 10000000;\\r\\n                            //location_time = timestamp;\\r\\n                            beacon_data = `${latitude},${longitude},${mac},${descr}`;\\r\\n                            general += 'BEACON location (lat):' + latitude + ', (long):' + longitude + ', (mac):' + mac + ', (description):' + descr + ', (rssi):' + rssi + ', (battery):' + battery_beacon + ', (listIndex):' + beacId + ',';\\r\\n                            break;\\r\\n                            //Cell Towers Note\\r\\n                        case '29':\\r\\n                            location_type = 'LBS';\\r\\n                            lbs_data = '';\\r\\n                            var mccHex = changeEndianness(value.substring(0, 4));\\r\\n                            var mncHex = value.substring(4, 6);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            lbs_data += mcc + ',';\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            lbs_data += mnc + ',';\\r\\n                            var indexLbs = 6;\\r\\n                            var numTowers = (hexToDecimal(keyLengthHex) - 4) / 7;\\r\\n                            for (let i = 0; i < numTowers; i++) {\\r\\n                                var rxlHex = changeEndianness(value.substring(indexLbs, indexLbs + 2));\\r\\n                                var rxl = hexToDecimal(rxlHex);\\r\\n                                var lacHex = changeEndianness(value.substring(indexLbs + 2, indexLbs + 6));\\r\\n                                var lac = hexToDecimal(lacHex);\\r\\n                                var cellTowers = hexToDecimal(changeEndianness(value.substring(indexLbs + 6, indexLbs + 14)));\\r\\n                                lbs_data += rxl + ',' + lac + ',' + cellTowers + ',';\\r\\n                                indexLbs += 14;\\r\\n                            }\\r\\n                            lbs_data = lbs_data.slice(0, -1);\\r\\n                            general += lbs_data;\\r\\n                            break;\\r\\n                        case '30':\\r\\n                            //G-sensor. \\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numStep = (keyLength - 2) / 16;\\r\\n                            for (let j = 0; j < numStep; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var stepHex = value.substring(8, 16);\\r\\n                                stepHex = changeEndianness(stepHex);\\r\\n                                var stepRate = hexToDecimal(stepHex);\\r\\n                                info = stepRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'STP';\\r\\n                                general += ' step counting' + j + ':' + stepRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //Activity\\r\\n                        case '31':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //BLE MAC list\\r\\n                        case '32':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Beacon List\\r\\n                        case '33':\\r\\n                            //I don't understand\\r\\n                            break;\\r\\n                            //Heart Rate Data\\r\\n                        case '40':\\r\\n                            if (customID != '04') {\\r\\n                                AddValue(codeValues, \\\"error\\\", \\\"customID not belongs to this protocol\\\");\\r\\n                                //AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                                AddValue(codeValues, \\\"customID\\\", value);\\r\\n                                return\\r\\n                            }\\r\\n                            var numHeartRate = (keyLength - 2) / 12;\\r\\n                            for (let j = 0; j < numHeartRate; j++) {\\r\\n                                var timestampHex = value.substring(0, 8);\\r\\n                                timestampHex = changeEndianness(timestampHex);\\r\\n                                timestamp = hexToDecimal(timestampHex);\\r\\n                                //timestamp = hexToDecimalSigned(timestampHex);\\r\\n                                var heartRateHex = value.substring(8, 10);\\r\\n                                var heartRate = hexToDecimal(heartRateHex);\\r\\n                                var trustLevelHex = value.substring(10, 12);\\r\\n                                var trustLevel = hexToDecimal(trustLevelHex);\\r\\n                                info = heartRate;\\r\\n                                //var alarmCode = 'True';\\r\\n                                var alarm = 'HRT';\\r\\n                                general += ' heart rate' + j + ':' + heartRate + ',';\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            break;\\r\\n                            //BLE Connected  . For Flic button\\r\\n                        case '62':\\r\\n                            location_type = 'BLE';\\r\\n                            var flag = hexToDecimal(value.substring(0, 2)); // 0= Disconnected, 1= Connected\\r\\n                            var macRaw = value.substring(2, 14); // No need to flip it\\r\\n                            // add : format in MAC\\r\\n                            var mac = macRaw.match(/.{1,2}/g).join(':');\\r\\n                            var batLevel = hexToDecimal(value.substring(14, 16)); // 0-100, 255 = invalid / unknown\\r\\n                            var isValidBattery = batLevel >= 0 && batLevel <= 100;\\r\\n                            ble_data = `${flag},${batLevel},${mac}`;\\r\\n                            general += 'BLE location (State):' + flag + ', (bat):' + batLevel + ', (mac):' + mac + ',';\\r\\n                            // send to accessory protocol ACCESSORY-UPDATE;861629050921968-010203040506;1772625669;Button;battery=75;\\r\\n                            // Build accessory update.\\r\\n                            // If battery is invalid (>100, e.g. 0xFF), do NOT send battery field.\\r\\n                            // This allows the receiver to keep the last known valid battery value.\\r\\n                            var accessoryParams = [];\\r\\n                            if (isValidBattery) {\\r\\n                                accessoryParams.push(`battery=${batLevel}`);\\r\\n                            }\\r\\n                            accessoryParams.push(`status=${flag}`);\\r\\n                            messageForReceiver = `ACCESSORY-UPDATE;${imei}-${macRaw};${timestamp};Button;${accessoryParams.join(',')};`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n                if (alarmCode) {\\r\\n                    messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                } else if (statusDevice) {\\r\\n                    messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                }\\r\\n                /*else if (alarm === 'HRT') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};HRT=${info};TLEVEL=${trustLevel};LABEL=bpm`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else if (alarm === 'STP') {\\r\\n                               messageForReceiver = (`CareWatch-${alarm};${imei};STATUS=${status_data};ETIME=${timestamp};GENERAL=${general};${info};STP=${info};LABEL=steps`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           } else {\\r\\n                               messageForReceiver = (`CareWatch-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                               sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                           }*/\\r\\n                // rest the alarm value\\r\\n                alarm = '';\\r\\n            }\\r\\n            if (command == '02') {\\r\\n                // Delete previous defined homeBeacons to leave the UI blank when all beacons are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                // Delete previous defined WiFi Networks to leave the UI blank when all Networks are removed.\\r\\n                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    switch (key) {\\r\\n                        //Module Number\\r\\n                        case '01':\\r\\n                            var date = value.substring(6, 8) + value.substring(4, 6) + '-' + value.substring(2, 4) + '-' + value.substring(0, 2);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            // Software version\\r\\n                        case '02':\\r\\n                            //no ACK need\\r\\n                            var fwVersion = 'v' + hexToDecimal(value.substring(6, 8)) + '.' + hexToDecimal(value.substring(4, 6)) + '.' + hexToDecimal(value.substring(2, 4)) + '.' + hexToDecimal(value.substring(0, 2));\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersion\\\", fwVersion);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersion, fwVersion);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersion);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                        case '1A': // FW version\\r\\n                            //no ACK need\\r\\n                            var fwVersionL = hex_to_ascii(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                            AddValue(codeValues, \\\"fwVersionL\\\", fwVersionL);\\r\\n                            messageForReceiver = (`Roam;ACK-FIRM;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CurrentFirmwareVersionLong, fwVersionL);\\r\\n                            AddValue(configsToUpdate, configIds.OnDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\r\\n                            configsToAck.push(configIds.ReadState.CurrentFirmwareVersionLong);\\r\\n                            configsToAck.push(configIds.OnDevice.LastDateTimeRead);\\r\\n                            break;\\r\\n                            //IMEI\\r\\n                        case '03':\\r\\n                            var imei = hexToDecimal(value);\\r\\n                            // harcode to avoid conflicts with Rio protocol\\r\\n                            //if ((imei != '860470063029395') && (imei != '860470063035947')) {\\r\\n                            //    AddValue(codeValues, \\\"error\\\", \\\"device imei is not in this protocol\\\");\\r\\n                            //    AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n                            //AddValue(codeValues, \\\"IMEI\\\", imei);\\r\\n                            //    return\\r\\n                            //}\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                //return;\\r\\n                            }\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //ICCID\\r\\n                        case '04':\\r\\n                            var iccid = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //BLE-MAC\\r\\n                        case '05':\\r\\n                            var bleMac = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                            //Run Time\\r\\n                        case '07':\\r\\n                            var runTime = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '10': // Ringer Volume\\r\\n                            var volume = hexToDecimal(value);\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-VOL;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"Volume\\\", volume);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.Volume, volume);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.Volume);\\r\\n                            break;\\r\\n                        case '0A': //Performance  mode\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            //AddValue(codeValues, \\\"WorkMode\\\", workMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            //configsToAck.push(configIds.ReadPerformance`Settings.Mode);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            //var workMode = hexToDecimal(value);\\r\\n                            //var workMode = hex_to_ascii(value.substring(0, value.length));\\r\\n                            var workMode = 1234; // + value + \\\"end\\\";\\r\\n                            //var workModeVal = 9;\\r\\n                            //workMode = 'test10';\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //AddValue(codeValues, \\\"performanceMode\\\", performanceMode);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, performanceMode);\\r\\n                            // configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            break;\\r\\n                        case '1B':\\r\\n                            //Decimal o ascii?\\r\\n                            var gsmModule = hexToDecimal(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '1F':\\r\\n                            //System Language\\r\\n                            var systemLanguage = hex_to_ascii(value.substring(0, value.length));\\r\\n                            switch (systemLanguage) {\\r\\n                                case 'en-US':\\r\\n                                    systemLanguage = 'English';\\r\\n                                    break;\\r\\n                                case 'es':\\r\\n                                    systemLanguage = 'Spanish';\\r\\n                                    break;\\r\\n                                case 'de':\\r\\n                                    systemLanguage = 'German';\\r\\n                                    break;\\r\\n                                case 'pt':\\r\\n                                    systemLanguage = 'Portuguese';\\r\\n                                    break;\\r\\n                                case 'fr':\\r\\n                                    systemLanguage = 'French';\\r\\n                                    break;\\r\\n                                case 'it':\\r\\n                                    systemLanguage = 'Italian';\\r\\n                                    break;\\r\\n                                case 'nl-NL':\\r\\n                                    systemLanguage = 'Dutch';\\r\\n                                    break;\\r\\n                                case 'zh-CN':\\r\\n                                    systemLanguage = 'Chinese';\\r\\n                                    break;\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            messageForReceiver = (`Roam;ACK-LANG;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"SystemLanguage\\\", systemLanguage);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.SystemLanguage, systemLanguage);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.SystemLanguage);\\r\\n                            break;\\r\\n                        case '33': // phone option\\r\\n                            // [Value]:83 0B 00 00 {\\\"phoneOption\\\":{\\\"flag_value\\\":2947,\\\"s3\\\":1,\\\"s4\\\":0,\\\"s5\\\":1,\\\"s6\\\":0,\\\"callIncoming\\\":0,\\\"rings\\\":3,\\\"s7\\\":0,\\\"toneID\\\":0,\\\"s1\\\":1,\\\"s2\\\":1}}\\r\\n                            var statusPhone = hex2bin(value.substring(0, 2)); // To find autoanswer setup\\r\\n                            if (statusPhone.substring(0, 1) == '1') { // 1 Enable\\r\\n                                var auto = 'true';\\r\\n                            } else var auto = 'false';\\r\\n                            statusPhone = hex2bin(value.substring(2, 4)); // To find allow list setup\\r\\n                            if (statusPhone.substring(7, 8) == '1') { // 1 Enable\\r\\n                                allow = 'true';\\r\\n                            } else var allow = 'false';\\r\\n                            //statusPhone = hex2bin(value.substring(0, 2)) + hex2bin(value.substring(2, 4));\\r\\n                            //AddValue(configsToUpdate, configIds.ReadSystemSettings.Statusphone, statusPhone);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AllowList, allow);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSystemSettings.AutoAnswer, auto);\\r\\n                            //configsToAck.push(configIds.ReadSystemSettings.Statusphone);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AllowList);\\r\\n                            configsToAck.push(configIds.ReadSystemSettings.AutoAnswer);\\r\\n                            break;\\r\\n                        case '30': //ContactList\\r\\n                            var contactNumber = value.substring(1, 2);\\r\\n                            var telLength = hexToDecimal(value.substring(2, 4));\\r\\n                            var tel = '';\\r\\n                            switch (contactNumber) {\\r\\n                                // Emergency Number\\r\\n                                case '0':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"EmergencyNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAlertSettings.EmergencyNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadAlertSettings.EmergencyNumber);\\r\\n                                    break;\\r\\n                                    // Speed Dial Number\\r\\n                                case '1':\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    AddValue(codeValues, \\\"SpeedDialNumber\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.SpeedDialNumber, tel);\\r\\n                                    configsToAck.push(configIds.ReadSpeedDialSettings.SpeedDialNumber);\\r\\n                                    break;\\r\\n                                    // Gateway Number\\r\\n                                case '9': //00447781482635,Esendex UK    0034627177148,Esendex Spain    00447507288240,Esendex UK Acceptance\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.includes('447781482635') || tel.includes('00447781482635')) {\\r\\n                                        tel = 'Esendex UK'\\r\\n                                    } else if (tel.includes('34627177148') || tel.includes('0034627177148')) {\\r\\n                                        tel = 'Esendex Spain'\\r\\n                                    } else if (tel.includes('447507288240') || tel.includes('00447507288240')) {\\r\\n                                        tel = 'Esendex UK Acceptance'\\r\\n                                    } else {\\r\\n                                        tel = 'Default'\\r\\n                                    }\\r\\n                                    AddValue(codeValues, \\\"SMSGateway\\\", tel);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadCommunicationSettings.SMSGateway, tel);\\r\\n                                    configsToAck.push(configIds.ReadCommunicationSettings.SMSGateway);\\r\\n                                    break;\\r\\n                                default:\\r\\n                                    tel = hex_to_ascii(value.substring(4, 4 + (2 * telLength)));\\r\\n                                    if (tel.length < 6) {\\r\\n                                        contacts += '';\\r\\n                                        AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                        AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                        configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                        break;\\r\\n                                    }\\r\\n                                    //contacts += 'A' + (contactNumber - 1) + ': ' + tel + ', ';\\r\\n                                    contacts += tel + ', ';\\r\\n                                    AddValue(codeValues, \\\"ApprovedContacts\\\", contacts);\\r\\n                                    AddValue(configsToUpdate, configIds.ReadAdditionalSettings.ApprovedContacts, contacts);\\r\\n                                    configsToAck.push(configIds.ReadAdditionalSettings.ApprovedContacts);\\r\\n                                    break;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '40': // APN\\r\\n                            //no ACK need\\r\\n                            var apn = hex_to_ascii(value.substring(0, value.length));\\r\\n                            imei = serverParams.Imei;\\r\\n                            break;\\r\\n                        case '41': // APN Username\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            break;\\r\\n                        case '42': // APN Password\\r\\n                            //no ACK need\\r\\n                            //apn = apn + ',' + hex_to_ascii(value.substring(0, value.length));\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"apn\\\", apn);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.APN, apn);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.APN);\\r\\n                            break;\\r\\n                        case '43': //Server Details\\r\\n                            //52.232.85.255,5678   production  52.174.17.77,5678  acceptance\\r\\n                            var serverDetails = hex_to_ascii(value.substring(6, value.length)) + ':' + hexToDecimal(value.substring(4, 6) + value.substring(2, 4));\\r\\n                            if (serverDetails.includes('52.232.85.255:5678')) {\\r\\n                                serverDetails = 'Production'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5678')) {\\r\\n                                serverDetails = 'Acceptance'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5778')) {\\r\\n                                serverDetails = 'Protocol-Import'\\r\\n                            } else if (serverDetails.includes('52.174.17.77:5878')) {\\r\\n                                serverDetails = 'Protocol-Dev'\\r\\n                            } else {\\r\\n                                serverDetails = 'Default'\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"server\\\", serverDetails);\\r\\n                            AddValue(configsToUpdate, configIds.ReadCommunicationSettings.Server, serverDetails);\\r\\n                            configsToAck.push(configIds.ReadCommunicationSettings.Server);\\r\\n                            break;\\r\\n                        case '44': //time interval - work mode intervals\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-MODE;${imei};`);\\r\\n                            var workMode = 0;\\r\\n                            var cycle = hexToDecimal(value.substring(10, 12) + value.substring(8, 10));\\r\\n                            var lazyCycle = hexToDecimal(value.substring(18, 20) + value.substring(16, 18));\\r\\n                            if (cycle == 240 && lazyCycle == 3600) { // 4 mins and 1 hour\\r\\n                                //workMode = 'High Frequency';\\r\\n                                workMode = 3;\\r\\n                            }\\r\\n                            if (cycle == 600 && lazyCycle == 3600) { // 10 mins and 1 hour\\r\\n                                //workMode = 'Balanced';\\r\\n                                workMode = 2;\\r\\n                            }\\r\\n                            if (cycle == 28800 && lazyCycle == 43200) { // 6 hour and 12 hours\\r\\n                                //workMode = 'Power Saving';\\r\\n                                workMode = 1;\\r\\n                            }\\r\\n                            if (cycle == 86400 && lazyCycle == 86400) { // 24 hours and 24 hours\\r\\n                                //workMode = 'No Reporting';\\r\\n                                workMode = 0;\\r\\n                            }\\r\\n                            AddValue(codeValues, \\\"Mode\\\", workMode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadPerformanceSettings.Mode, workMode);\\r\\n                            configsToAck.push(configIds.ReadPerformanceSettings.Mode);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '47': // Custom Id\\r\\n                            let mode;\\r\\n                            if (value === \\\"04\\\") {\\r\\n                                mode = \\\"Roam\\\";\\r\\n                            } else if (value === \\\"64\\\") {\\r\\n                                mode = \\\"Sentry\\\";\\r\\n                            } else {\\r\\n                                mode = \\\"Rio\\\";\\r\\n                            }\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-CUSTID;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"customeid\\\", mode);\\r\\n                            AddValue(configsToUpdate, configIds.ReadState.CustomId, mode);\\r\\n                            configsToAck.push(configIds.ReadState.CustomId);\\r\\n                            break;\\r\\n                        case '53': // Non motion alert\\r\\n                            //2B020080\\r\\n                            var status = hex2bin(value.substring(6, 8));\\r\\n                            var alertSetting = '';\\r\\n                            var enableDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enableDisable = '1';\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                            };\\r\\n                            //if (status.substring(5, 6) == '1') {\\r\\n                            //    alertSetting += 'Dial, '\\r\\n                            //} else {\\r\\n                            //    alertSetting += 'No Dial, '\\r\\n                            //};\\r\\n                            var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-NOMOTION;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"nomotion\\\", alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings, enableDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.EnableDisableNonMovementSettings);\\r\\n                            configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                        case '56': //Fall down sensibility\\r\\n                            // '00001100'\\r\\n                            var fallStatus = hex2bin(value.substring(0, 2));\\r\\n                            var enalbleDisable = '';\\r\\n                            //if (fallStatus.substring(4, 5) == '1') {\\r\\n                            if (fallStatus.substring(0, 1) == '1') {\\r\\n                                var sensibility = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                var sensibility = 'Disable, '\\r\\n                            };\\r\\n                            if (fallStatus.substring(5, 6) == '1') {\\r\\n                                sensibility += 'Dial, '\\r\\n                            } else {\\r\\n                                sensibility += 'No Dial, '\\r\\n                            };\\r\\n                            var imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-FALLALERT;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            var sesibityOptionValue = hexToDecimal(value.substring(1, 2));\\r\\n                            sensibility += sesibityOptionValue;\\r\\n                            AddValue(codeValues, \\\"sensibility\\\", sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAlertSettings.FallSettings, sensibility);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.EnableDisableFallSettings, enalbleDisable);\\r\\n                            AddValue(configsToUpdate, configIds.ReadFallSettings.Sensitivity, sesibityOptionValue);\\r\\n                            configsToAck.push(configIds.ReadAlertSettings.FallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.EnableDisableFallSettings);\\r\\n                            configsToAck.push(configIds.ReadFallSettings.Sensitivity);\\r\\n                            break;\\r\\n                        case '73': //BeaconList\\r\\n                            var beaconNumber = hexToDecimal(value.substring(1, 2));\\r\\n                            var beaconStatus = hex2bin(value.substring(0, 1));\\r\\n                            beaconStatus = hex_to_ascii(value.substring(30, value.length));\\r\\n                            //beaconStatus = changeEndianness(value.substring(30, value.length));\\r\\n                            //homeBeacon += 'B' + (beaconNumber + 1) + ': ' + beaconStatus + ', ';\\r\\n                            homeBeacon += beaconStatus + ', ';\\r\\n                            AddValue(codeValues, \\\"homeBeacon\\\", homeBeacon);\\r\\n                            messageForReceiver = (`Roam;ACK-GDATA;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(configsToUpdate, configIds.ReadAdditionalSettings.HomeBeacon, homeBeacon);\\r\\n                            configsToAck.push(configIds.ReadAdditionalSettings.HomeBeacon);\\r\\n                            break;\\r\\n                        case '4A': //Wifi Network List\\r\\n                            var wifiSSIDLenght = hexToDecimal(value.substring(2, 4));\\r\\n                            var wifiPasswordLenght = hexToDecimal(value.substring(4, 6));\\r\\n                            var wifiIndex = hexToDecimal(value.substring(1, 2));\\r\\n                            //var wifiStatus = hexToDecimal(value.substring(0, 1));\\r\\n                            var wifiStatus = value.substring(0, 1);\\r\\n                            /*var enalbleDisable = wifiSSID = wifiPassword = homeWifi = '';\\r\\n                            /var homeWifi = '';\\r\\n                            if (wifiIndex == '0') {   // Only first Wifi of the list\\r\\n                                if (wifiStatus == '8') {\\r\\n                                    homeWifi += ' Enable, '\\r\\n                                    enalbleDisable = '1';\\r\\n                                } else {\\r\\n                                    homeWifi += ' Disable, '\\r\\n                                    //enalbleDisable = '0';\\r\\n                                };*/\\r\\n                            if ((wifiStatus == '8') || (wifiStatus == 'C')) { // 8 == ON OR C== ON and Connected\\r\\n                                var wifiSSID = hex_to_ascii(value.substring(6, 6 + 2 * (wifiSSIDLenght)));\\r\\n                                var wifiPassword = hex_to_ascii(value.substring(6 + 2 * (wifiSSIDLenght), 6 + 2 * (wifiSSIDLenght + wifiPasswordLenght)));\\r\\n                                var imei = serverParams.Imei;\\r\\n                                messageForReceiver = (`Roam;ACK-WIFI;${imei};`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                                //homeWiFi += 'W' + (wifiIndex + 1) + ': ' + wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                homeWiFi += wifiSSID + ', ' + wifiPassword + ';';\\r\\n                                AddValue(codeValues, \\\"wifi\\\", homeWiFi);\\r\\n                                AddValue(configsToUpdate, configIds.ReadWiFiList.WiFiList, homeWiFi);\\r\\n                                configsToAck.push(configIds.ReadWiFiList.WiFiList);\\r\\n                            }\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.SSID, wifiSSID);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadWiFiSettings.Password, wifiPassword);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.EnableDisableReadWiFiSettings);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.SSID);\\r\\n                            //configsToAck.push(configIds.ReadWiFiSettings.Password);\\r\\n                            break;\\r\\n                        case '21': // Speed Dial Settings\\r\\n                            // [Value]:53 84 {\\\"call1Button\\\":{\\\"mode\\\":0,\\\"feedBack\\\":3,\\\"task\\\":2,\\\"time\\\":20,\\\"status\\\":1}}\\r\\n                            var status = hex2bin(value.substring(2, 4)); //always pass 2 HEXs to this function\\r\\n                            var alertSetting = '';\\r\\n                            var enalbleDisable = '';\\r\\n                            if (status.substring(0, 1) == '1') {\\r\\n                                alertSetting = 'Enable, '\\r\\n                                enalbleDisable = '1'\\r\\n                            } else {\\r\\n                                alertSetting = 'Disable, '\\r\\n                                //enableDisable = '0';\\r\\n                            };\\r\\n                            //var time = hexToDecimal(value.substring(2, 4) + value.substring(0, 2));\\r\\n                            //alertSetting += time;\\r\\n                            imei = serverParams.Imei;\\r\\n                            messageForReceiver = (`Roam;ACK-SPEED;${imei};`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            AddValue(codeValues, \\\"speed\\\", alertSetting);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadAlertSettings.NoMotionAlert, value + '-' + alertSetting);\\r\\n                            AddValue(configsToUpdate, configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings, enalbleDisable);\\r\\n                            //AddValue(configsToUpdate, configIds.ReadNonMovementSettings.Time, time);\\r\\n                            //configsToAck.push(configIds.ReadAlertSettings.NoMotionAlert);\\r\\n                            configsToAck.push(configIds.ReadSpeedDialSettings.EnableDisableReadSpeedDialSettings);\\r\\n                            //configsToAck.push(configIds.ReadNonMovementSettings.Time);\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '03') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                    var keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                    debug('key = ' + key);\\r\\n                    debug('value = ' + value);\\r\\n                    switch (key) {\\r\\n                        case '01': // Device ID\\r\\n                            var imei = hex_to_ascii(value);\\r\\n                            // create long connection if it is needed\\r\\n                            if (serverParams.Imei === undefined || serverParams.Imei === null) {\\r\\n                                sendMessageToLocalhostNoWait(\\\"Eview-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\");\\r\\n                                // no return;\\r\\n                            }\\r\\n                            break;\\r\\n                        case '10': // Heartbeat\\r\\n                            var heartbeat = hex_to_ascii(value);\\r\\n                            event_time = moment.utc().unix();\\r\\n                            if (index < total_length + 16) {\\r\\n                                var keyLengthHex = message.substring(index, index = index + 2);\\r\\n                                keyLength = 2 * hexToDecimal(keyLengthHex);\\r\\n                                key = message.substring(index, index = index + 2);\\r\\n                                if (key == '24') {\\r\\n                                    //     debug('key: ' + key) //comment those out\\r\\n                                    value = message.substring(index, index = index + keyLength - 2);\\r\\n                                    //    debug(value)\\r\\n                                    var timestampHex = value.substring(0, 8);\\r\\n                                    //    debug('timestampt hex: ' + timestampHex)\\r\\n                                    timestampHex = changeEndianness(timestampHex);\\r\\n                                    timestamp = hexToDecimal(timestampHex);\\r\\n                                    event_time = timestamp;\\r\\n                                    //    debug(event_time)\\r\\n                                    var statusHex = changeEndianness(value.substring(8, 16));\\r\\n                                    //    debug(statusHex)\\r\\n                                    var statusInt = hexToDecimal(statusHex);\\r\\n                                    var statusDevice = '';\\r\\n                                    if ((statusInt & 1) == 1) {\\r\\n                                        statusDevice += 'GPS,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2) == 2) {\\r\\n                                        statusDevice += 'WIFISource,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4) == 4) {\\r\\n                                        statusDevice += 'CellTower,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 8) == 8) {\\r\\n                                        statusDevice += 'BLELocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 16) == 16) {\\r\\n                                        statusDevice += 'Charging,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 32) == 32) {\\r\\n                                        statusDevice += 'FUllyCharged,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 64) == 64) {\\r\\n                                        statusDevice += 'Reboot,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 128) == 128) {\\r\\n                                        statusDevice += 'HistoricalData,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 256) == 256) {\\r\\n                                        statusDevice += 'AGPSDataValid,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 512) == 512) {\\r\\n                                        statusDevice += 'Motion,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 1024) == 1024) {\\r\\n                                        statusDevice += 'SmartLocating,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 2048) == 2048) {\\r\\n                                        statusDevice += 'BeaconLocation,';\\r\\n                                    }\\r\\n                                    if ((statusInt & 4096) == 4096) {\\r\\n                                        statusDevice += 'BLEConnected,';\\r\\n                                    }\\r\\n                                    statusDevice = statusDevice.slice(0, -1);\\r\\n                                    //   debug('statusHex:' + statusHex)\\r\\n                                    statusHex = (statusHex);\\r\\n                                    statusHex = hex2bin(statusHex);\\r\\n                                    statusHex = ('00000000000000000000000000000000' + statusHex).slice(-32);\\r\\n                                    //    debug(statusHex)\\r\\n                                    battery_percentage = parseInt(statusHex.substring(0, 8), 2);\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(battery_percentage)\\r\\n                                    //    debug(statusHex.substring(8, 13))\\r\\n                                    cellNetworkSignal = parseInt(statusHex.substring(8, 13), 2);\\r\\n                                    //    debug(cellNetworkSignal)\\r\\n                                    workMode = parseInt(statusHex.substring(13, 16), 2);\\r\\n                                    //    debug(workMode)\\r\\n                                    general += 'statusDevice:' + statusDevice + ';';\\r\\n                                    if (battery_percentage) {\\r\\n                                        general += 'battery:' + battery_percentage + ';';\\r\\n                                    }\\r\\n                                    if (cellNetworkSignal) {\\r\\n                                        general += 'cellNetworkSignal:' + cellNetworkSignal + ';';\\r\\n                                    }\\r\\n                                    if (workMode) {\\r\\n                                        general += 'workMode:' + workMode + ';';\\r\\n                                    }\\r\\n                                }\\r\\n                            }\\r\\n                            // revisar\\r\\n                            var gen_location = '0';\\r\\n                            messageForReceiver = (`Roam-HTB;${imei};STATUS=${status_data};TIME=${event_time};BATP=${battery_percentage};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            //messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '12': // Device requesting timestamp\\r\\n                            timestamp = moment.utc().unix();\\r\\n                            timestampHex = decimalToHex(timestamp);\\r\\n                            timestampHex = changeEndianness(timestampHex);\\r\\n                            keyLengthHex = ('00' + decimalToHex(1 + (timestampHex.length) / 2)).slice(-2);\\r\\n                            // respond to device with the timestamp of the server\\r\\n                            messageBody = messageBody + keyLengthHex + key + timestampHex;\\r\\n                            messageForReceiver = `Eview;${imei};${sequenceID};Get timestamp`;\\r\\n                            sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            break;\\r\\n                        case '21': //Cell Towers\\r\\n                            var mccHex = value.substring(0, 2);\\r\\n                            var mncHex = value.substring(2, 3);\\r\\n                            var mcc = hexToDecimal(mccHex);\\r\\n                            var mnc = hexToDecimal(mncHex);\\r\\n                            var numTowers = (keyLength - 4) / 5;\\r\\n                            var cellTowers = hex_to_ascii(value);\\r\\n                            messageBody = messageBody + keyLengthHex + key + value;\\r\\n                            break;\\r\\n                        case '22': // WIFI locations \\r\\n                            location_type = 'WIFI';\\r\\n                            var numWifi = Math.round((hexToDecimal(keyLengthHex) - 1) / 7);\\r\\n                            //location_time = timestamp;\\r\\n                            var wifiTowers = value;\\r\\n                            general += 'wifiTowers:';\\r\\n                            var indexWifi = 0;\\r\\n                            var bssid_array = [];\\r\\n                            gen_location = '';\\r\\n                            for (let i = 0; i < numWifi; i++) {\\r\\n                                gen_location += wifiTowers.substring(indexWifi + 2, indexWifi + 14) + ',';\\r\\n                                indexWifi += 14;\\r\\n                            }\\r\\n                            gen_location = gen_location.slice(0, -1);\\r\\n                            general += gen_location;\\r\\n                            if (alarmCode) {\\r\\n                                messageForReceiver = (`Roam-${alarm};${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else if (statusDevice) {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            } else {\\r\\n                                messageForReceiver = (`Roam-CYC;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};SIGNAL=${cellNetworkSignal};WM=${workMode};GENERAL=${general}`);\\r\\n                                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                            }\\r\\n                            alarmCode = '';\\r\\n                            break;\\r\\n                    }\\r\\n                }\\r\\n            }\\r\\n            if (command == '04') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7E') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            if (command == '7F') {\\r\\n                // while (index < total_length + 16) {\\r\\n                var keyLength = message.substring(index, index = index + 2);\\r\\n                keyLength = 2 * hexToDecimal(keyLength);\\r\\n                var key = message.substring(index, index = index + 2);\\r\\n                imei = serverParams.Imei;\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n                messageForReceiver = (`Roam-ACK;${imei};${message}`); // ${sequenceID}; add ${sequenceID}; 19-07\\r\\n                sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                if (key == 'F0') { // Battery low (<40) when executing OTA\\r\\n                    event_time = moment.utc().unix();\\r\\n                    messageForReceiver = (`Roam-OBTL;${imei};STATUS=${status_data};LTIME=${location_time};ETIME=${event_time};BATP=${battery_percentage};LGPS=${gps_data};LWIF=${wifi_data};LLBS=${lbs_data};LBEACON=${beacon_data};BLE=${ble_data};GENERAL=${general};${info}`);\\r\\n                    sendMessageToLocalhostNoWait(messageForReceiver);\\r\\n                    configsToAck.push(configIds.Controls.FirmwareUpgrade);\\r\\n                }\\r\\n                var value = message.substring(index, index = index + keyLength - 2);\\r\\n                AddValue(configsToUpdate, configIds.ConfigureDevice.LastConfigured, moment().format('YYYY/MM/DD, HH:mm:ss'));\\r\\n                configsToAck.push(configIds.ConfigureDevice.LastConfigured);\\r\\n                //}\\r\\n            }\\r\\n            if (command == 'FE') {\\r\\n                while (index < total_length + 16) {\\r\\n                    var keyLength = message.substring(index, index = index + 2);\\r\\n                    keyLength = 2 * hexToDecimal(keyLength);\\r\\n                    var key = message.substring(index, index = index + 2);\\r\\n                    var value = message.substring(index, index = index + keyLength - 2);\\r\\n                }\\r\\n            }\\r\\n            // prepare the ACK msg and change config if it is needed\\r\\n            lengthAck = messageBody.length / 2;\\r\\n            lengthAck = ('0000' + decimalToHex(lengthAck)).slice(-4);\\r\\n            lengthAck = lengthAck.toString().substring(2, 4) + lengthAck.toString().substring(0, 2);\\r\\n            ////////////checksum CRC 16\\r\\n            var checksumAck = byteStringToByteArray(messageBody);\\r\\n            checksumAck = crc16byte(checksumAck);\\r\\n            checksumAck = decimalToHex(checksumAck);\\r\\n            checksumAck = ('0000' + checksumAck).slice(-4);\\r\\n            checksumAck = checksumAck.toString().substring(2, 4) + checksumAck.toString().substring(0, 2);\\r\\n            prefix = prefix + lengthAck + checksumAck + sequenceID;\\r\\n            // To send ACK to the device previous to internal msg with parts\\r\\n            if (needsAck == true) {\\r\\n                if (messageBody.length <= 2) {\\r\\n                    ack = 'AB00030008C7' + sequenceID + '7F0100'; // change AB10030008C7 to AB00030008C7\\r\\n                } else {\\r\\n                    ack = prefix + messageBody;\\r\\n                }\\r\\n                AddValue(codeValues, 'imei', imei);\\r\\n                AddValue(codeValues, 'ack', ack);\\r\\n            }\\r\\n        } else { // checksum was invalid - print out useful debug info and bet quess at imei \\r\\n            AddValue(codeValues, \\\"error\\\", \\\"checksum failed for message\\\");\\r\\n            AddValue(codeValues, \\\"rawFromBytes\\\", rawFromBytes);\\r\\n            i = rawFromBytes.search('3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]3[0-9]');\\r\\n            if (i >= 0) {\\r\\n                imei = hex_to_ascii(rawFromBytes.substring(i, i + 30));\\r\\n                AddValue(codeValues, \\\"imei\\\", imei);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n    // operation functions\\r\\n    function AddValue(codeValueArray, p1, p2) { // push code value pair into array\\r\\n        if (p2 !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                code: p1,\\r\\n                value: p2\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function AddConfig(codeValueArray, configName, newvalue) {\\r\\n        if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n            var cvpair = {\\r\\n                'code': configName,\\r\\n                'value': newvalue, // ?  newvalue : \\\"Not Defined\\\" \\r\\n                'forced': true\\r\\n            };\\r\\n            codeValueArray.push(cvpair);\\r\\n        };\\r\\n    }\\r\\n    // Utils functions\\r\\n    function ascii_to_hexa(str) { // ascii to hex \\r\\n        var arr1 = [];\\r\\n        for (var n = 0, l = str.length; n < l; n++) {\\r\\n            var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n            arr1.push(hex);\\r\\n        }\\r\\n        return arr1.join('');\\r\\n    }\\r\\n\\r\\n    function byteStringToByteArray(str) { //\\r\\n        var splitStr = [];\\r\\n        var j = 0;\\r\\n        for (let i = 0; i < str.length; i += 2) {\\r\\n            splitStr[j] = str.substring(i, i + 2);\\r\\n            j++;\\r\\n        }\\r\\n        var bytes = [];\\r\\n        var bytePos = 0;\\r\\n        for (let i = 0; i < splitStr.length; i++) {\\r\\n            var byteStr = splitStr[i];\\r\\n            var b = parseInt(byteStr, 16);\\r\\n            if (b < 256) {\\r\\n                bytes[bytePos] = b;\\r\\n                bytePos++;\\r\\n            }\\r\\n        }\\r\\n        return bytes;\\r\\n    }\\r\\n\\r\\n    function changeEndianness(string) { //\\r\\n        const result = [];\\r\\n        let len = string.length - 2;\\r\\n        while (len >= 0) {\\r\\n            result.push(string.substr(len, 2));\\r\\n            len -= 2;\\r\\n        }\\r\\n        return result.join('');\\r\\n    }\\r\\n\\r\\n    function hex2bin(hex) { //\\r\\n        return (parseInt(hex, 16).toString(2)).padStart(8, '0');\\r\\n    }\\r\\n\\r\\n    function calculateCheckSum(payloadData) { // check if payload checksum is valid\\r\\n        var checksum = byteStringToByteArray(payloadData);\\r\\n        checksum = crc16byte(checksum);\\r\\n        checksum = decimalToHex(checksum);\\r\\n        checksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\n        return changeEndianness(checksum);\\r\\n    }\\r\\n\\r\\n    function crc16byte(s) { //\\r\\n        var crc = 0x0000;\\r\\n        var j, i;\\r\\n        for (i = 0; i < s.length; i++) {\\r\\n            c = s[i];\\r\\n            if (c > 255) {\\r\\n                throw new RangeError();\\r\\n            }\\r\\n            j = (c ^ (crc >> 8)) & 0xFF;\\r\\n            crc = crcTable[j] ^ (crc << 8);\\r\\n        }\\r\\n        return ((crc ^ 0) & 0xFFFF);\\r\\n    }\\r\\n\\r\\n    function debug(...args) { // write debug info to console log, if localTesting\\r\\n        if (localTesting) {\\r\\n            console.debug('[DEBUG]', ...args);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function decimalToHex(x) { // decimal to hex\\r\\n        x = x.toString(16).toUpperCase();\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hex_to_ascii(str1) { // Hex to Ascii \\r\\n        var hex = str1.toString();\\r\\n        var str = '';\\r\\n        for (var n = 0; n < hex.length; n += 2) {\\r\\n            str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));\\r\\n        }\\r\\n        return str;\\r\\n    }\\r\\n\\r\\n    function hexToDecimalSigned(hex) { // hex to decimal\\r\\n        if (hex.length % 2 != 0) {\\r\\n            hex = \\\"0\\\" + hex;\\r\\n        }\\r\\n        var num = parseInt(hex, 16);\\r\\n        var maxVal = Math.pow(2, hex.length / 2 * 8);\\r\\n        if (num > maxVal / 2 - 1) {\\r\\n            num = num - maxVal;\\r\\n        }\\r\\n        return num;\\r\\n    }\\r\\n\\r\\n    function hexToDecimal(x) {\\r\\n        x = parseInt(x, 16);\\r\\n        return x;\\r\\n    }\\r\\n\\r\\n    function hexToBytes(hex) {\\r\\n        return Uint8Array.from(hex.replace(/[^0-9a-f]/gi, \\\"\\\").match(/.{1,2}/g).map(b => parseInt(b, 16)));\\r\\n    }\\r\\n\\r\\n    function bytesToHex(bytes) {\\r\\n        return Array.from(bytes, b => b.toString(16).padStart(2, \\\"0\\\").toUpperCase()).join(\\\"\\\");\\r\\n    }\\r\\n    // --- Multimsg splitter ---\\r\\n    function splitFramesFromHexStream(hex) {\\r\\n        const buf = hexToBytes(hex);\\r\\n        const frames = [];\\r\\n        const errors = [];\\r\\n        let i = 0;\\r\\n        while (i < buf.length) {\\r\\n            // Search header 0xAB\\r\\n            while (i < buf.length && buf[i] !== 0xAB) i++;\\r\\n            if (i >= buf.length) break;\\r\\n            const start = i;\\r\\n            // necesitamos al menos cabecera mínima: H(1)+Prop(1)+Len(2)+CRC(2)+Seq(2)=8\\r\\n            if (buf.length - i < 8) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: \\\"Quedan menos de 8 bytes para cabecera\\\"\\r\\n                });\\r\\n                break; // incompleto al final del stream\\r\\n            }\\r\\n            const props = buf[i + 1];\\r\\n            const len = buf[i + 2] | (buf[i + 3] << 8); // Length LE (solo body)\\r\\n            const total = 1 + 1 + 2 + 2 + 2 + len;\\r\\n            if (len > 1024) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Length fuera de rango (${len})`\\r\\n                });\\r\\n                i++; // re-sync: avanzar 1 y seguir buscando siguiente 0xAB\\r\\n                continue;\\r\\n            }\\r\\n            if (buf.length - i < total) {\\r\\n                errors.push({\\r\\n                    offset: i,\\r\\n                    reason: `Frame incompleto: requiere ${total} bytes`\\r\\n                });\\r\\n                break; // final del stream sin completar\\r\\n            }\\r\\n            const frameBytes = buf.slice(i, i + total);\\r\\n            frames.push(bytesToHex(frameBytes));\\r\\n            i += total; // saltar al siguiente posible frame\\r\\n        }\\r\\n        return {\\r\\n            frames,\\r\\n            errors\\r\\n        };\\r\\n    }\\r\\n    // --- Decodificador de stream (N frames concatenados) ---\\r\\n    function decodeHexStream(hex) {\\r\\n        const {\\r\\n            frames,\\r\\n            errors\\r\\n        } = splitFramesFromHexStream(hex);\\r\\n        const decoded = frames.map(h => {\\r\\n            try {\\r\\n                return {\\r\\n                    ok: true,\\r\\n                    ...decoder(h)\\r\\n                };\\r\\n            } catch (e) {\\r\\n                return {\\r\\n                    ok: false,\\r\\n                    error: e.message,\\r\\n                    rawHex: h\\r\\n                };\\r\\n            }\\r\\n        });\\r\\n        return {\\r\\n            decoded,\\r\\n            splitErrors: errors\\r\\n        };\\r\\n    }\\r\\n\\r\\n    function sendMessageToLocalhostNoWait(str, attempt) { // sends message to system, closing connection after\\r\\n        var maxRetries = 3;\\r\\n        var timeout = 5000; // 5 seconds connection timeout\\r\\n        var baseDelay = 500; // base delay for exponential backoff in ms\\r\\n        attempt = attempt || 1;\\r\\n        var server;\\r\\n        if (localTesting) {\\r\\n            debug('[sendMessageToLocalhostNoWait] local testing - sending to p-dev server');\\r\\n            debug('[sendMessageToLocalhostNoWait] message:', str);\\r\\n            server = '52.174.17.77';\\r\\n            port = '5878'; // p-dev\\r\\n        } else {\\r\\n            server = '127.0.0.1';\\r\\n            port = '5678';\\r\\n        }\\r\\n        var client = net.createConnection(port, server, function() {\\r\\n            client.write(`${str}`);\\r\\n            client.end();\\r\\n        });\\r\\n        client.setTimeout(timeout, function() {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + ' timed out (attempt ' + attempt + '/' + maxRetries + ')');\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'timeout_attempt_' + attempt + '_of_' + maxRetries);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n        client.on('error', function(error) {\\r\\n            debug('[sendMessageToLocalhostNoWait] Connection to ' + server + ':' + port + '  failed (attempt ' + attempt + '/' + maxRetries + '): ' + error.message);\\r\\n            AddValue(codeValues, 'sendToLocalHost_error', 'connection_failed_attempt_' + attempt + '_of_' + maxRetries + ':' + error.message);\\r\\n            client.destroy();\\r\\n            if (attempt < maxRetries) {\\r\\n                var delay = baseDelay * Math.pow(2, attempt - 1);\\r\\n                debug('[sendMessageToLocalhostNoWait] Retrying in ' + delay + 'ms...');\\r\\n                setTimeout(function() {\\r\\n                    sendMessageToLocalhostNoWait(str, attempt + 1);\\r\\n                }, delay);\\r\\n            } else {\\r\\n                AddValue(codeValues, 'sendToLocalHost_error', 'all_' + maxRetries + '_attempts_failed');\\r\\n            }\\r\\n        });\\r\\n    }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n    module.exports = {\\r\\n        execute_ops\\r\\n    }\\r\\n} else { // on server use local defined vars\\r\\n    let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n    // define global returns\\r\\n    msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1790536192}]}],"Groups":[{"Id":6206,"Parent":null,"Name":"Setup","Json":"{\"description\":null,\"columns\":3,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6207,"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Controls","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6207,\"Parent\":{\"Id\":6206,\"Name\":\"Setup\",\"Json\":{\"description\":null,\"columns\":3,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Controls\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1760526087},{"Type":1,"NewValue":"{\"Id\":6207,\"Parent\":{\"Id\":6206,\"Name\":\"Setup\",\"Json\":{\"description\":null,\"columns\":3,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Controls\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"LanguageId\":null,\"ProtocolActionObjects\":[]}","Timestamp":1761816097}]},{"Id":6208,"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Configure Device","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6209,"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"On Device","Json":"{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6210,"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Additional Settings","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6210,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Additional Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736425387},{"Type":1,"NewValue":"{\"Id\":6210,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Additional Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427637},{"Type":1,"NewValue":"{\"Id\":6210,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Additional Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":4,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427688}]},{"Id":6212,"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Communication Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6213,"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Additional Settings","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6213,\"Parent\":{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6213,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6268,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6253,\"Name\":\"Alert Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6259,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Additional Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":4,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427737}]},{"Id":6214,"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"No Activity","Json":"{\"description\":\"No Activity\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6214,\"Parent\":{\"Id\":6253,\"Name\":\"Alert Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6214,\"Name\":\"No Activity\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6254,\"Name\":\"Fall Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6256,\"Name\":\"Non Movement Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"No Activity\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":5,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340470}]},{"Id":6216,"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read State","Json":"{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6217,"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Communication Settings","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6219,"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Approved Contacts","Json":"{\"description\":\"Approved Contacts\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6219,\"Parent\":{\"Id\":6213,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6219,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6652,\"Name\":\"Speed Dial\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6577,\"Name\":\"Beacon List\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":10,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Approved Contacts\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":7,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340390}]},{"Id":6253,"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Alert Settings","Json":"{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6253,\"Parent\":{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6253,\"Name\":\"Alert Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6268,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6213,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6259,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Alert Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427728}]},{"Id":6254,"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Fall Settings","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6256,"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Non Movement Settings","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6259,"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"System Settings","Json":"{\"description\":\"System Settings\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6259,\"Parent\":{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6259,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6268,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6253,\"Name\":\"Alert Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6213,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"System Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":6,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340526},{"Type":1,"NewValue":"{\"Id\":6259,\"Parent\":{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6259,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6268,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6253,\"Name\":\"Alert Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6213,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"System Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":5,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427742}]},{"Id":6268,"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Performance Settings","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6268,\"Parent\":{\"Id\":6208,\"Name\":\"Configure Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6268,\"Name\":\"Performance Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6253,\"Name\":\"Alert Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6213,\"Name\":\"Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6259,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Performance Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427733}]},{"Id":6296,"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Performance Settings","Json":"{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6296,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Performance Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736425391},{"Type":1,"NewValue":"{\"Id\":6296,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Performance Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":4,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736425516},{"Type":1,"NewValue":"{\"Id\":6296,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Performance Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427677},{"Type":1,"NewValue":"{\"Id\":6296,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Performance Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427926},{"Type":1,"NewValue":"{\"Id\":6296,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Performance Settings\",\"Json\":\"{\\\"description\\\":null,\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427938}]},{"Id":6297,"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Alert Settings","Json":"{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6297,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Alert Settings\",\"Json\":\"{\\\"description\\\":\\\"Read Alert Settings\\\",\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736425512},{"Type":1,"NewValue":"{\"Id\":6297,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Alert Settings\",\"Json\":\"{\\\"description\\\":\\\"Read Alert Settings\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427634},{"Type":1,"NewValue":"{\"Id\":6297,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Alert Settings\",\"Json\":\"{\\\"description\\\":\\\"Read Alert Settings\\\",\\\"columns\\\":1,\\\"order\\\":3,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427684},{"Type":1,"NewValue":"{\"Id\":6297,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Alert Settings\",\"Json\":\"{\\\"description\\\":\\\"Read Alert Settings\\\",\\\"columns\\\":1,\\\"order\\\":2,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736427923}]},{"Id":6303,"Parent":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Fall Settings","Json":"{\"description\":\"Read Fall Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6303,\"Parent\":{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6303,\"Name\":\"Read Fall Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6305,\"Name\":\"Read Non Movement Settings\",\"Json\":{\"description\":\"Read Non Movement Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Fall Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340245}]},{"Id":6305,"Parent":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Non Movement Settings","Json":"{\"description\":\"Read Non Movement Settings\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6305,\"Parent\":{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6305,\"Name\":\"Read Non Movement Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6303,\"Name\":\"Read Fall Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read Non Movement Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340275}]},{"Id":6334,"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read System Settings","Json":"{\"description\":\"Read System Settings\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6334,\"Parent\":{\"Id\":6209,\"Name\":\"On Device\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6210,\"Name\":\"Read Additional Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6296,\"Name\":\"Read Performance Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6297,\"Name\":\"Read Alert Settings\",\"Json\":{\"description\":\"Read Alert Settings\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read System Settings\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":5,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340297}]},{"Id":6577,"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Beacon List","Json":"{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":10,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6652,"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Speed Dial","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6653,"Parent":{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read Speed Dial Settings","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6746,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"d2","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 3,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6747,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"d1","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 3,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6748,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"t1","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 2,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6750,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"t3","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 2,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 3}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6751,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"t2","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 2,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6774,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"DG","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6775,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"DG","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6803,"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"WiFi List","Json":"{\"description\":\"WiFi List\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6803,\"Parent\":{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6803,\"Name\":\"WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"WiFi List\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":5,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340361},{"Type":1,"NewValue":"{\"Id\":6803,\"Parent\":{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6803,\"Name\":\"WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6859,\"Name\":\"Oysta Office\",\"Json\":{\"description\":\"WiFi List\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6972,\"Name\":\"Eulalia Home\",\"Json\":{\"description\":\"WiFi List\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"],\"index\":2},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6966,\"Name\":\"MOVISTAR_OYSTA\",\"Json\":{\"description\":\"WiFi List\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6940,\"Name\":\"Wifi1\",\"Json\":{\"description\":\"WiFi List\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"],\"index\":1},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},{\"Id\":6860,\"Name\":\"Home\",\"Json\":{\"description\":\"WiFi List\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"],\"index\":2},\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]}]},\"Name\":\"WiFi List\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":5,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736530831}]},{"Id":6805,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"A2","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 2,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6806,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"A3","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 2,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 3}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6809,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"B3","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 3,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 3}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6814,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"B2","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 3,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6815,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"B4","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 3,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6820,"Parent":{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Read WiFi List","Json":"{\"description\":\"Read WiFi List\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6820,\"Parent\":{\"Id\":6212,\"Name\":\"Read Communication Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[{\"Id\":6820,\"Name\":\"Read WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]}]},\"Name\":\"Read WiFi List\",\"Json\":\"{\\\"description\\\":\\\"\\\",\\\"columns\\\":1,\\\"order\\\":1,\\\"listSize\\\":1,\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\"]}\",\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"ProtocolActionObjects\":[]}","Timestamp":1736340151}]},{"Id":6847,"Parent":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"w113","Json":"{  \"description\": \"WiFi List\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6848,"Parent":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"w12","Json":"{  \"description\": \"WiFi List\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6859,"Parent":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Oysta Office","Json":"{  \"description\": \"WiFi List\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6860,"Parent":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Home","Json":"{  \"description\": \"WiFi List\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6861,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"home","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 2,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6862,"Parent":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"home","Json":"{  \"description\": \"Approved Contacts\",  \"columns\": 1,  \"order\": 2,  \"listSize\": 7,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6863,"Parent":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Oysta Office","Json":"{  \"description\": \"WiFi List\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6864,"Parent":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Home","Json":"{  \"description\": \"WiFi List\",  \"columns\": 1,  \"order\": 1,  \"listSize\": 5,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 2}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":6865,"Parent":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"home","Json":"{  \"description\": null,  \"columns\": 1,  \"order\": 3,  \"listSize\": 10,  \"toTranslate\": [    \"name\",    \"description\"  ],  \"index\": 1}","DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]}],"GroupParams":[{"Id":11192,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Get Current Config","Json":"{\"name\":\"Get Current Config\",\"default\":\"\",\"description\":\"Get Current Config\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Retrieve the current config from the device. Please do this before and after the configuration of the device\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11192,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Current Config\",\"Json\":\"{\\\"name\\\":\\\"Get Current Config\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get Current Config\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Retrieve the current config from the device. Please do this before and after the configuration of the device\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465197}],"LanguageId":null,"Tags":[]},{"Id":11197,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Power Off","Json":"{\"name\":\"Power Off\",\"default\":\"\",\"description\":\"Power Off\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Turn the device off remotely\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11197,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Power Off\",\"Json\":\"{\\\"name\\\":\\\"Power Off\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Power Off\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Turn the device off remotely\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761815787}],"LanguageId":null,"Tags":[]},{"Id":11326,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Get Language / Performance","Json":"{\"name\":\"Get Language / Performance\",\"default\":\"\",\"description\":\"Get Language / Performance\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Get Language / Performance\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":13}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11271,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Get Alert Settings","Json":"{\"name\":\"Get Alert Settings\",\"default\":\"\",\"description\":\"Get Alert Settings\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Get Alert Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":11}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11198,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Get Firmware Version","Json":"{\"name\":\"Get Firmware Version\",\"default\":\"\",\"description\":\"Get Firmware Version\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Retrieve the current firmware version from the device.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":12}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11199,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Configuration Mode","Json":"{\"name\":\"Configuration Mode\",\"default\":\"false\",\"description\":\"Configuration Mode\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Makes the device connect to the server quicker to enable a faster setup time.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11199,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Configuration Mode\",\"Json\":\"{\\\"name\\\":\\\"Configuration Mode\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Configuration Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Makes the device connect to the server quicker to enable a faster setup time.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465195},{"Type":1,"NewValue":"{\"Id\":11199,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Configuration Mode\",\"Json\":\"{\\\"name\\\":\\\"Configuration Mode\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Configuration Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Makes the device connect to the server quicker to enable a faster setup time.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":1}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465337}],"LanguageId":null,"Tags":[]},{"Id":11220,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Controls","Json":"{\"name\":\"Enable Disable Controls\",\"default\":\"\",\"description\":null,\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11191,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Firmware Upgrade","Json":"{\"name\":\"Firmware Upgrade\",\"default\":\"\",\"description\":\"Firmware Upgrade\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Upgrade the device to the latest firmware (if available)\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":9}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11191,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Firmware Upgrade\",\"Json\":\"{\\\"name\\\":\\\"Firmware Upgrade\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Firmware Upgrade\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Upgrade the device to the latest firmware (if available)\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761683436},{"Type":0,"NewValue":"{\"Id\":11191,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Firmware Upgrade\",\"Json\":\"{\\\"name\\\":\\\"Firmware Upgrade\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Firmware Upgrade\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Upgrade the device to the latest firmware (if available)\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":5816,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.7\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"actionTriggerOTA\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"// Trigger OTA\\r\\nvar configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//create value for URL  40.91.195.192:8098\\r\\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\\r\\n// http://40.91.195.192:8098/api/fi_ota  (test server)\\r\\n// production server 'http://13.81.174.129:8098/api/fi_ota';\\r\\nif (params.CommunicationSettings.Server === '52.232.85.255,5678') {\\r\\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\\r\\n} else {\\r\\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\\r\\n}\\r\\nvar value = ascii_to_hexa(value).toUpperCase();\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\n// control command\\r\\nvar command = '04';\\r\\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\\r\\nvar key = '30';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes;\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString;\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x !== 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin;\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa;\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761683439},{"Type":1,"NewValue":"{\"Id\":11191,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Firmware Upgrade\",\"Json\":\"{\\\"name\\\":\\\"Firmware Upgrade\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Firmware Upgrade\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Upgrade the device to the latest firmware (if available)\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761815784}],"LanguageId":null,"Tags":[]},{"Id":11193,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Real Time Locate","Json":"{\"name\":\"Real Time Locate\",\"default\":\"\",\"description\":\"Real Time Locate\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Sends a command to find the GPS location of the device\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11193,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Real Time Locate\",\"Json\":\"{\\\"name\\\":\\\"Real Time Locate\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Real Time Locate\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Sends a command to find the GPS location of the device\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465202}],"LanguageId":null,"Tags":[]},{"Id":11189,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Factory Reset","Json":"{\"name\":\"Factory Reset\",\"default\":\"\",\"description\":\"Factory Reset\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Reset the device the Oysta factory defaults\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":10}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11194,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Find Device","Json":"{\"name\":\"Find Device\",\"default\":\"\",\"description\":\"Find Device\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Click this to send a command to the device that will help the VIP find their device if lost in the home. The device will emit a sound.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11195,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Clear Buffered Messages","Json":"{\"name\":\"Clear Buffered Messages\",\"default\":\"\",\"description\":\"Clear Buffered Messages\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Clear all pending messages to the server\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":3}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11195,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Buffered Messages\",\"Json\":\"{\\\"name\\\":\\\"Clear Buffered Messages\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Buffered Messages\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clear all pending messages to the server\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465200}],"LanguageId":null,"Tags":[]},{"Id":11196,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Reboot","Json":"{\"name\":\"Reboot\",\"default\":\"\",\"description\":\"Reboot\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Power cycle the device remotely.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11196,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reboot\",\"Json\":\"{\\\"name\\\":\\\"Reboot\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reboot\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Power cycle the device remotely.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761815789}],"LanguageId":null,"Tags":[]},{"Id":11222,"Group":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Enable Disable Configure Device","Json":"{\"name\":\"Enable Disable Configure Device\",\"default\":\"\",\"description\":null,\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11201,"Group":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Last Configured","Json":"{\"name\":\"Last Configured\",\"default\":\"\",\"description\":\"Last Configured\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11221,"Group":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Enable Disable On Device","Json":"{\"name\":\"Enable Disable On Device\",\"default\":\"\",\"description\":null,\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11200,"Group":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"LastDateTimeRead","Json":"{\"name\":\"LastDateTimeRead\",\"default\":\"\",\"description\":\"Last Update\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11203,"Group":{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Approved Contacts","Json":"{\"name\":\"Approved Contacts\",\"default\":\"\",\"description\":\"Current Approved Contacts\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11204,"Group":{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Home Beacon","Json":"{\"name\":\"Home Beacon\",\"default\":\"\",\"description\":\"Current Home Beacon\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11208,"Group":{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"APN","Json":"{\"name\":\"APN\",\"default\":\"\",\"description\":\"Current APN\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The Access Point Name stored on the device will be reported and shown here.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11206,"Group":{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"SMS Gateway","Json":"{\"name\":\"SMS Gateway\",\"default\":\"\",\"description\":\"SMS Gateway\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The SMS gateway that the device is using to send and receive SMSs (Esendex UK/Esendex Spain)\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11207,"Group":{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Server","Json":"{\"name\":\"Server\",\"default\":\"\",\"description\":\"Current Server\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The server the device is currently reporting to will be shown here: Acceptance/Production\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11209,"Group":{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"Set No Activity Events\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":10080,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set No Activity Alerts in minutes. If the device does not report in the time frame it triggers a No Activity alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11209,\"Group\":{\"Id\":6214,\"Name\":\"No Activity\",\"Json\":{\"description\":\"No Activity\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"No Activity\",\"Json\":\"{\\\"name\\\":\\\"No Activity\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set No Activity Events\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":5,\\\"max\\\":10080,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Set No Activity Alerts in minutes. If the device does not report in the time frame it triggers a No Activity alert\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1734525297}],"LanguageId":null,"Tags":[{"Id":2149,"Name":"noActivityInterval","BackendAction":"noActivityInterval","Value":""}]},{"Id":11210,"Group":{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable No Activity","Json":"{\"name\":\"Enable Disable No Activity\",\"default\":\"true\",\"description\":\"Enable Disable No Activity \",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable or disable no activity alerts\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11210,\"Group\":{\"Id\":6214,\"Name\":\"No Activity\",\"Json\":{\"description\":\"No Activity\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable No Activity\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable No Activity\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable No Activity \\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable or disable no activity alerts\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736339464}],"LanguageId":null,"Tags":[{"Id":2152,"Name":"activateNoActivity","BackendAction":"activateNoActivity","Value":""}]},{"Id":11202,"Group":{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Current Firmware Version","Json":"{\"name\":\"Current Firmware Version\",\"default\":\"\",\"description\":\"Current Firmware Version\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11202,\"Group\":{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Current Firmware Version\",\"Json\":\"{\\\"name\\\":\\\"Current Firmware Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Version (Application Software Version)\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Application‑level software controlling GPS logic, fall detection, protocol behaviour, feature flags, and OTA update logic. This version changes frequently and determines how the device behaves.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1790530734},{"Type":1,"NewValue":"{\"Id\":11202,\"Group\":{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Current Firmware Version\",\"Json\":\"{\\\"name\\\":\\\"Current Firmware Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Version (Application Software Version)\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Application‑level software controlling GPS logic, fall detection, protocol behaviour, feature flags, and OTA update logic. This version changes frequently and determines how the device behaves.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":0}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1790530815}],"LanguageId":null,"Tags":[]},{"Id":11279,"Group":{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Custom Id","Json":"{\"name\":\"Custom Id\",\"default\":\"\",\"description\":\"Custom Id\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Custom Id\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11279,\"Group\":{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Custom Id\",\"Json\":\"{\\\"name\\\":\\\"Custom Id\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Custom Id\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Custom Id\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1790530820}],"LanguageId":null,"Tags":[]},{"Id":11214,"Group":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"SMS Gateway","Json":"{\"name\":\"SMS Gateway\",\"default\":\"\",\"description\":\"Set SMS Gateway\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"value\":\"00447781482635,Esendex UK\",\"label\":\"Esendex UK\"},{\"value\":\"0034627177148,Esendex Spain\",\"label\":\"Esendex Spain\"},{\"value\":\"00447507288240,Esendex UK Acceptance\",\"label\":\"Esendex UK Acceptance\"},{\"label\":\"default\",\"value\":\"default\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11214,\"Group\":{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SMS Gateway\",\"Json\":\"{\\\"name\\\":\\\"SMS Gateway\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set SMS Gateway\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select the SMS gateway that the device will use to send and receive SMSs (Esendex UK/Esendex Spain)\\\",\\\"options\\\":[{\\\"value\\\":\\\"00447781482635,Esendex UK\\\",\\\"label\\\":\\\"Esendex UK\\\"},{\\\"value\\\":\\\"0034627177148,Esendex Spain\\\",\\\"label\\\":\\\"Esendex Spain\\\"},{\\\"value\\\":\\\"00447507288240,Esendex UK Acceptance\\\",\\\"label\\\":\\\"Esendex UK Acceptance\\\"},{\\\"value\\\":\\\"default\\\",\\\"label\\\":\\\"default\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449062}],"LanguageId":null,"Tags":[]},{"Id":11216,"Group":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"APN","Json":"{  \"name\": \"APN\",  \"default\": \"\",  \"description\": \"Set APN\",  \"type\": \"apn\",  \"suffix\": null,  \"prefix\": null,  \"min\": null,  \"max\": null,  \"futureOnly\": false,  \"integerOnly\": false,  \"isReadOnly\": false,  \"isHidden\": false,  \"minLength\": null,  \"maxLength\": null,  \"helpText\": null,  \"options\": [    {      \"value\": \" iot.cslm2m.com,,\",      \"label\": \" CSL (NEW)  [test]\"    },    {      \"value\": \"hs.vodafone.ie,,\",      \"label\": \"Vodafone HS [Ireland]\"    },    {      \"value\": \"movistar.es,MOVISTAR,MOVISTAR\",      \"label\": \"Movistar\"    },    {      \"value\": \"m2m.movistar.es,movistar,movistar\",      \"label\": \"Movistar M2M Spain [Spain]\"    },    {      \"value\": \"inetd.vfes,,\",      \"label\": \"Spainiot \"    },    {      \"value\": \"airtelwap.es,wap@wap,wap\",      \"label\": \"Vodafone 4G  [Spain]\"    },    {      \"value\": \"wlapn.com,deimos,deimos\",      \"label\": \"DEIMOS  [Spain]\"    },    {      \"value\": \" iot.cslm2m.com,,\",      \"label\": \" CSL (NEW)  [test]\"    },    {      \"value\": \"ukiot1,,\",      \"label\": \"BT-EE-trial   [UK]\"    },    {      \"value\": \"test,,\",      \"label\": \"test []\"    },    {      \"value\": \"stream.co.uk,streamip,streamip\",      \"label\": \"stream \"    },    {      \"value\": \"m2m.vodafone.es,Vodafone,Vodafone\",      \"label\": \"m2m.vodafone.es  [Spain]\"    },    {      \"value\": \"m2m.vodafone.es,vodafone,vodafone\",      \"label\": \"m2m Vodafone Spain  [Spain]\"    },    {      \"value\": \"autoselect,,\",      \"label\": \"autoselect \"    },    {      \"value\": \"internet,0,0\",      \"label\": \"China Mobile GPRS\"    }  ],  \"toTranslate\": [    \"name\",    \"description\",    \"helpText\",    \"label\"  ]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11216,\"Group\":{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"APN\",\"Json\":\"{\\\"name\\\":\\\"APN\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set APN\\\",\\\"type\\\":\\\"apn\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select the Access Point Name of your provider\\\",\\\"options\\\":[{\\\"value\\\":\\\" iot.cslm2m.com,,\\\",\\\"label\\\":\\\" CSL (NEW)  [test]\\\"},{\\\"value\\\":\\\"hs.vodafone.ie,,\\\",\\\"label\\\":\\\"Vodafone HS [Ireland]\\\"},{\\\"value\\\":\\\"movistar.es,MOVISTAR,MOVISTAR\\\",\\\"label\\\":\\\"Movistar\\\"},{\\\"value\\\":\\\"m2m.movistar.es,movistar,movistar\\\",\\\"label\\\":\\\"Movistar M2M Spain [Spain]\\\"},{\\\"value\\\":\\\"inetd.vfes,,\\\",\\\"label\\\":\\\"Spainiot \\\"},{\\\"value\\\":\\\"airtelwap.es,wap@wap,wap\\\",\\\"label\\\":\\\"Vodafone 4G  [Spain]\\\"},{\\\"value\\\":\\\"wlapn.com,deimos,deimos\\\",\\\"label\\\":\\\"DEIMOS  [Spain]\\\"},{\\\"value\\\":\\\" iot.cslm2m.com,,\\\",\\\"label\\\":\\\" CSL (NEW)  [test]\\\"},{\\\"value\\\":\\\"ukiot1,,\\\",\\\"label\\\":\\\"BT-EE-trial   [UK]\\\"},{\\\"value\\\":\\\"test,,\\\",\\\"label\\\":\\\"test []\\\"},{\\\"value\\\":\\\"stream.co.uk,streamip,streamip\\\",\\\"label\\\":\\\"stream \\\"},{\\\"value\\\":\\\"m2m.vodafone.es,Vodafone,Vodafone\\\",\\\"label\\\":\\\"m2m.vodafone.es  [Spain]\\\"},{\\\"value\\\":\\\"m2m.vodafone.es,vodafone,vodafone\\\",\\\"label\\\":\\\"m2m Vodafone Spain  [Spain]\\\"},{\\\"value\\\":\\\"autoselect,,\\\",\\\"label\\\":\\\"autoselect \\\"},{\\\"value\\\":\\\"internet,0,0\\\",\\\"label\\\":\\\"China Mobile GPRS\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736448942}],"LanguageId":null,"Tags":[]},{"Id":11213,"Group":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Name":"Server","Json":"{\"name\":\"Server\",\"default\":\"\",\"description\":\"Set Server\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"value\":\"default\",\"label\":\"default\"},{\"value\":\"52.232.85.255,5678\",\"label\":\"Production\"},{\"value\":\"52.174.17.77,5678\",\"label\":\"Acceptance\"},{\"label\":\"Protocol-Import\",\"value\":\"52.174.17.77,5778\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11213,\"Group\":{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Server\",\"Json\":\"{\\\"name\\\":\\\"Server\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set Server\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select the server the device will report: Acceptance/Production\\\",\\\"options\\\":[{\\\"value\\\":\\\"default\\\",\\\"label\\\":\\\"default\\\"},{\\\"value\\\":\\\"52.232.85.255,5678\\\",\\\"label\\\":\\\"Production\\\"},{\\\"value\\\":\\\"52.174.17.77,5678\\\",\\\"label\\\":\\\"Acceptance\\\"},{\\\"value\\\":\\\"52.174.17.77,5778\\\",\\\"label\\\":\\\"Protocol-Import\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449011},{"Type":1,"NewValue":"{\"Id\":11213,\"Group\":{\"Id\":6217,\"Name\":\"Communication Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Server\",\"Json\":\"{\\\"name\\\":\\\"Server\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set Server\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select the server the device will report: Acceptance/Production\\\",\\\"options\\\":[{\\\"value\\\":\\\"52.232.85.255,5678\\\",\\\"label\\\":\\\"Production\\\"},{\\\"value\\\":\\\"52.174.17.77,5678\\\",\\\"label\\\":\\\"Acceptance\\\"},{\\\"value\\\":\\\"52.174.17.77,5778\\\",\\\"label\\\":\\\"Protocol-Import\\\"},{\\\"label\\\":\\\"Protocol-dev\\\",\\\"value\\\":\\\"52.174.17.77,5878\\\"},{\\\"label\\\":\\\"Default\\\",\\\"value\\\":\\\"Default\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742495687}],"LanguageId":null,"Tags":[]},{"Id":11261,"Group":{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Contact","Json":"{\"name\":\"Contact\",\"default\":\"\",\"description\":\"Contact\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11261,\"Group\":{\"Id\":6219,\"Name\":\"Approved Contacts\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":7,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Contact\",\"Json\":\"{\\\"name\\\":\\\"Contact\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Contact\\\",\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Phone number of the contact\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449634}],"LanguageId":null,"Tags":[]},{"Id":11296,"Group":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Emergency Number","Json":"{\"name\":\"Emergency Number\",\"default\":\"\",\"description\":\"Emergency Number\",\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The number called when the default SOS button is pushed on the device (typically the ARC)\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11241,"Group":{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Fall Settings","Json":"{\"name\":\"Enable Disable Fall Settings\",\"default\":\"false\",\"description\":\"Toggle Fall alert\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Toggle feature that raises an alarm when the VIP falls and breaches the specified sensitivity setting\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11242,"Group":{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Sensitivity","Json":"{\"name\":\"Sensitivity\",\"default\":\"\",\"description\":\"Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":1,\"max\":9,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"1-9 (9 high sensitivity/low trigger)\",\"options\":[{\"value\":\"3\",\"label\":\"Low\"},{\"value\":\"6\",\"label\":\"Medium\"},{\"value\":\"9\",\"label\":\"High\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11243,"Group":{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Non Movement Settings","Json":"{\"name\":\"Enable Disable Non Movement Settings\",\"default\":\"\",\"description\":\"Toggle Non-movement alert\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Toggle feature on Rio for raising an alarm when VIP has not moved for a specified time.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11244,"Group":{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Time","Json":"{\"name\":\"Time\",\"default\":\"\",\"description\":\"Time in non-movement\",\"type\":\"radioGroup\",\"suffix\":\"seconds\",\"prefix\":null,\"min\":60,\"max\":36000,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The time the VIP has to be still before the non-movement alarm is raised\",\"options\":[{\"label\":\"30 minutes\",\"value\":\"1800\"},{\"label\":\"1 hour\",\"value\":\"3600\"},{\"label\":\"1 hour 30 minutes\",\"value\":\"5400\"},{\"label\":\"2 hours\",\"value\":\"7200\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11315,"Group":{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Volume","Json":"{\"name\":\"Volume\",\"default\":\"\",\"description\":\"Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The volume of the ring tone, speaker and voice prompt for the device.\",\"options\":[{\"value\":\"0\",\"label\":\"Off\"},{\"value\":\"20\",\"label\":\"Low\"},{\"value\":\"50\",\"label\":\"Medium\"},{\"value\":\"80\",\"label\":\"High\"},{\"value\":\"100\",\"label\":\"Max\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11273,"Group":{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"SystemLanguage","Json":"{\"name\":\"SystemLanguage\",\"default\":\"\",\"description\":\"System Language\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"System Language\",\"options\":[{\"value\":\"en-US\",\"label\":\"en-US\"},{\"value\":\"nl-NL\",\"label\":\"nl-NL\"},{\"value\":\"de\",\"label\":\"de\"},{\"value\":\"fr\",\"label\":\"fr\"},{\"value\":\"pt\",\"label\":\"pt\"},{\"value\":\"es\",\"label\":\"es\"},{\"value\":\"it\",\"label\":\"it\"},{\"label\":\"zh-CN\",\"value\":\"zh-CN\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11273,\"Group\":{\"Id\":6259,\"Name\":\"System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SystemLanguage\",\"Json\":\"{\\\"name\\\":\\\"SystemLanguage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"System Language\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"System Language\\\",\\\"options\\\":[{\\\"label\\\":\\\"English\\\",\\\"value\\\":\\\"en-US\\\"},{\\\"label\\\":\\\"Spanish\\\",\\\"value\\\":\\\"es\\\"},{\\\"label\\\":\\\"German\\\",\\\"value\\\":\\\"de\\\"},{\\\"label\\\":\\\"Portuguese\\\",\\\"value\\\":\\\"pt\\\"},{\\\"label\\\":\\\"French\\\",\\\"value\\\":\\\"fr\\\"},{\\\"label\\\":\\\"Italian\\\",\\\"value\\\":\\\"it\\\"},{\\\"label\\\":\\\"Dutch\\\",\\\"value\\\":\\\"nl-NL\\\"},{\\\"label\\\":\\\"Chinese\\\",\\\"value\\\":\\\"zh-CN\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1776189439}],"LanguageId":null,"Tags":[]},{"Id":11314,"Group":{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"AutoAnswer","Json":"{\"name\":\"AutoAnswer\",\"default\":\"true\",\"description\":\"AutoAnswer\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Toggles feature that enables a number in the whitelist to call through  the device without any interaction required by the VIP\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11313,"Group":{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Allow List","Json":"{\"name\":\"Allow List\",\"default\":\"true\",\"description\":\"Allow List\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Toggles the allow list of members who can call the device\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11264,"Group":{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Mode","Json":"{\"name\":\"Mode\",\"default\":\"\",\"description\":\"Mode\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Mode settings\",\"options\":[{\"value\":\"0\",\"label\":\"No reporting\"},{\"value\":\"1\",\"label\":\"Power saving\"},{\"value\":\"2\",\"label\":\"Balanced\"},{\"value\":\"3\",\"label\":\"High frequency\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11270,"Group":{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Mode","Json":"{\"name\":\"Mode\",\"default\":\"\",\"description\":\"Mode\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Different modes for communication\",\"options\":[{\"label\":\"No reporting\",\"value\":\"0\"},{\"label\":\"Power saving\",\"value\":\"1\"},{\"label\":\"Balanced\",\"value\":\"2\"},{\"label\":\"High frequency\",\"value\":\"3\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11280,"Group":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"No Motion Alert","Json":"{\"name\":\"No Motion Alert\",\"default\":\"\",\"description\":\"No Motion Alert\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"No Motion Alert Debugging only\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11278,"Group":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Fall Settings","Json":"{\"name\":\"Fall Settings\",\"default\":\"\",\"description\":\"Fall Settings\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Fall Settings debugging only\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11297,"Group":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Emergency Number","Json":"{\"name\":\"Emergency Number\",\"default\":\"\",\"description\":\"Current Emergency Number\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"This is the number the device will call when the SOS button is pushed\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11285,"Group":{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Fall Settings","Json":"{\"name\":\"Enable Disable Fall Settings\",\"default\":\"false\",\"description\":\"Enable Disable Fall Settings\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable Disable Fall Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11286,"Group":{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Sensitivity","Json":"{\"name\":\"Sensitivity\",\"default\":\"\",\"description\":\"Sensitivity\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"1-9 (9 high sensitivity/low trigger)\",\"options\":[{\"value\":\"3\",\"label\":\"Low\"},{\"label\":\"Medium\",\"value\":\"6\"},{\"label\":\"High\",\"value\":\"9\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11283,"Group":{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Non Movement Settings","Json":"{\"name\":\"Enable Disable Non Movement Settings\",\"default\":\"false\",\"description\":\"Enable Disable Non Movement Settings\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable Disable Non Movement Settings\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11284,"Group":{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Time","Json":"{\"name\":\"Time\",\"default\":\"\",\"description\":\"Time in non-movement\",\"type\":\"radioGroup\",\"suffix\":\"seconds\",\"prefix\":null,\"min\":60,\"max\":123,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Time in non-movement\",\"options\":[{\"value\":\"1800\",\"label\":\"30 minutes\"},{\"value\":\"3600\",\"label\":\"1 hour\"},{\"value\":\"5400\",\"label\":\"1 hour 30 minutes\"},{\"value\":\"7200\",\"label\":\"2 hours\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11317,"Group":{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"System Language","Json":"{\"name\":\"System Language\",\"default\":\"\",\"description\":\"System Language\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"System Language\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11319,"Group":{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Allow List","Json":"{\"name\":\"Allow List\",\"default\":\"\",\"description\":\"Allow List\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11319,\"Group\":{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Allow List\",\"Json\":\"{\\\"name\\\":\\\"Allow List\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Allow List\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Only authorized or all numbers to call in\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736448669}],"LanguageId":null,"Tags":[]},{"Id":11324,"Group":{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Volume","Json":"{\"name\":\"Volume\",\"default\":\"\",\"description\":\"Volume\",\"type\":\"radioGroup\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":1,\"maxLength\":100,\"helpText\":\"Volume\",\"options\":[{\"label\":\"Off\",\"value\":\"0\"},{\"label\":\"Low\",\"value\":\"20\"},{\"label\":\"Medium\",\"value\":\"50\"},{\"label\":\"High\",\"value\":\"80\"},{\"label\":\"Max\",\"value\":\"100\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"],\"order\":3}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11324,\"Group\":{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Volume\",\"Json\":\"{\\\"name\\\":\\\"Volume\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Volume\\\",\\\"type\\\":\\\"radioGroup\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":1,\\\"maxLength\\\":100,\\\"helpText\\\":\\\"Volume level\\\",\\\"options\\\":[{\\\"value\\\":\\\"0\\\",\\\"label\\\":\\\"Off\\\"},{\\\"value\\\":\\\"20\\\",\\\"label\\\":\\\"Low\\\"},{\\\"value\\\":\\\"50\\\",\\\"label\\\":\\\"Medium\\\"},{\\\"value\\\":\\\"80\\\",\\\"label\\\":\\\"High\\\"},{\\\"value\\\":\\\"100\\\",\\\"label\\\":\\\"Max\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736448746}],"LanguageId":null,"Tags":[]},{"Id":11328,"Group":{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Auto Answer","Json":"{\"name\":\"Auto Answer\",\"default\":\"\",\"description\":\"Auto Answer\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Auto Answer\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11328,\"Group\":{\"Id\":6334,\"Name\":\"Read System Settings\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Auto Answer\",\"Json\":\"{\\\"name\\\":\\\"Auto Answer\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Auto Answer\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Auto Answer or Answer call by pressing button\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736448712}],"LanguageId":null,"Tags":[]},{"Id":11662,"Group":{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Beacon","Json":"{\"name\":\"Beacon\",\"default\":\"\",\"description\":null,\"type\":\"beacon\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11662,\"Group\":{\"Id\":6577,\"Name\":\"Beacon List\",\"Json\":{\"description\":null,\"columns\":1,\"order\":3,\"listSize\":10,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Beacon\",\"Json\":\"{\\\"name\\\":\\\"Beacon\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"beacon\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select beacon from the list\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449672}],"LanguageId":null,"Tags":[]},{"Id":11664,"Group":{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Speed Dial","Json":"{\"name\":\"Enable Disable Speed Dial\",\"default\":\"true\",\"description\":null,\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11665,"Group":{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Speed Dial Number","Json":"{\"name\":\"Speed Dial Number\",\"default\":\"\",\"description\":null,\"type\":\"phone\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11665,\"Group\":{\"Id\":6652,\"Name\":\"Speed Dial\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Speed Dial Number\",\"Json\":\"{\\\"name\\\":\\\"Speed Dial Number\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"phone\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The number called when the Speed Dial button is pushed on the device\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449551}],"LanguageId":null,"Tags":[]},{"Id":11667,"Group":{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Speed Dial Number","Json":"{\"name\":\"Speed Dial Number\",\"default\":\"\",\"description\":\"Current Speed Dial Number\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11667,\"Group\":{\"Id\":6653,\"Name\":\"Read Speed Dial Settings\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Speed Dial Number\",\"Json\":\"{\\\"name\\\":\\\"Speed Dial Number\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Speed Dial Number\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The number called when the Speed Dial button is pushed on the device\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736448507}],"LanguageId":null,"Tags":[]},{"Id":11666,"Group":{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable Read Speed Dial Settings","Json":"{\"name\":\"Enable Disable Read Speed Dial Settings\",\"default\":\"\",\"description\":null,\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11690,"Group":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"SSID","Json":"{\"name\":\"SSID\",\"default\":\"\",\"description\":\"SSID\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":1,\"maxLength\":32,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11690,\"Group\":{\"Id\":6803,\"Name\":\"WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SSID\",\"Json\":\"{\\\"name\\\":\\\"SSID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SSID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":1,\\\"maxLength\\\":32,\\\"helpText\\\":\\\"Add service set identifier (name) of the WiFi network\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449397},{"Type":1,"NewValue":"{\"Id\":11690,\"Group\":{\"Id\":6803,\"Name\":\"WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"SSID\",\"Json\":\"{\\\"name\\\":\\\"SSID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SSID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":1,\\\"maxLength\\\":32,\\\"helpText\\\":\\\"Add service set identifier (name) of the WiFi network\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":0}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736530779}],"LanguageId":null,"Tags":[]},{"Id":11691,"Group":{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Password","Json":"{\"name\":\"Password\",\"default\":\"\",\"description\":\"Password\",\"type\":\"password\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":8,\"maxLength\":16,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11691,\"Group\":{\"Id\":6803,\"Name\":\"WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Password\",\"Json\":\"{\\\"name\\\":\\\"Password\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Password\\\",\\\"type\\\":\\\"password\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":8,\\\"maxLength\\\":16,\\\"helpText\\\":\\\"Add password of the WiFi network\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736449434},{"Type":1,"NewValue":"{\"Id\":11691,\"Group\":{\"Id\":6803,\"Name\":\"WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":5,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":true,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Password\",\"Json\":\"{\\\"name\\\":\\\"Password\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Password\\\",\\\"type\\\":\\\"password\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":8,\\\"maxLength\\\":16,\\\"helpText\\\":\\\"Add password of the WiFi network\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":1}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736530782}],"LanguageId":null,"Tags":[]},{"Id":11692,"Group":{"Id":6820,"Name":"Read WiFi List","Json":{"description":"Read WiFi List","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6212,"Name":"Read Communication Settings","Json":{"description":"","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6209,"Name":"On Device","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":6206,"Name":"Setup","Json":{"description":null,"columns":3,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6208,"Name":"Configure Device","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6213,"Name":"Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6219,"Name":"Approved Contacts","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6746,"Name":"d2","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6747,"Name":"d1","Json":{"description":"Approved Contacts","columns":1,"order":3,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6774,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6775,"Name":"DG","Json":{"description":"Approved Contacts","columns":1,"order":1,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6805,"Name":"A2","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6806,"Name":"A3","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6861,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6862,"Name":"home","Json":{"description":"Approved Contacts","columns":1,"order":2,"listSize":7,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6577,"Name":"Beacon List","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6748,"Name":"t1","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6750,"Name":"t3","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6751,"Name":"t2","Json":{"description":null,"columns":1,"order":2,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6809,"Name":"B3","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":3},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6814,"Name":"B2","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6815,"Name":"B4","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6865,"Name":"home","Json":{"description":null,"columns":1,"order":3,"listSize":10,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6652,"Name":"Speed Dial","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6217,"Name":"Communication Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6803,"Name":"WiFi List","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6847,"Name":"w113","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6848,"Name":"w12","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6859,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6860,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6863,"Name":"Oysta Office","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":1},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6864,"Name":"Home","Json":{"description":"WiFi List","columns":1,"order":1,"listSize":5,"toTranslate":["name","description"],"index":2},"Parent":null,"Device":null,"DeviceRelated":true,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},{"Id":6253,"Name":"Alert Settings","Json":{"description":null,"columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6214,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6254,"Name":"Fall Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6256,"Name":"Non Movement Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6259,"Name":"System Settings","Json":{"description":"System Settings","columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6268,"Name":"Performance Settings","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6210,"Name":"Read Additional Settings","Json":{"description":null,"columns":1,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6653,"Name":"Read Speed Dial Settings","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6296,"Name":"Read Performance Settings","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6297,"Name":"Read Alert Settings","Json":{"description":"Read Alert Settings","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":6303,"Name":"Read Fall Settings","Json":{"description":"Read Fall Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":6305,"Name":"Read Non Movement Settings","Json":{"description":"Read Non Movement Settings","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},{"Id":6334,"Name":"Read System Settings","Json":{"description":"Read System Settings","columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"WiFi List","Json":"{\"name\":\"WiFi List\",\"default\":\"\",\"description\":\"Current WiFi List\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":11692,\"Group\":{\"Id\":6820,\"Name\":\"Read WiFi List\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"WiFi List\",\"Json\":\"{\\\"name\\\":\\\"WiFi List\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current WiFi List\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"SSID and password configurated in the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1736448357}],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465131},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4925,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setContinuousLocate\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nif (params.ContinuousLocate.Interval) {\\n    var Interval = parseInt(params.ContinuousLocate.Interval) * 60;\\n    Interval = decimalToHex(Interval);\\n    Interval = ('0000' + Interval).slice(-4).toUpperCase();\\n    Interval = Interval.substring(2, 4) + Interval.substring(0, 2);\\n}\\nif (params.ContinuousLocate.Duration) {\\n    var Duration = parseInt(params.ContinuousLocate.Duration) * 60;\\n    Duration = decimalToHex(Duration);\\n    Duration = ('0000' + Duration).slice(-4).toUpperCase();\\n    Duration = Duration.substring(2, 4) + Duration.substring(0, 2);\\n}\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '45';\\nvar messageBody = command + keyLength + key + Interval + Duration;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = [];\\n    var j = 0;\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2);\\n        j++;\\n    }\\n    var bytes = [];\\n    var bytePos = 0;\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i];\\n        var b = parseInt(byteStr, 16);\\n        if (b < 256) {\\n            bytes[bytePos] = b;\\n            bytePos++;\\n        }\\n    }\\n    return bytes;\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString;\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465135},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4962,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setEmergencySettings\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar phone_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\n//var confFall = '1100'; // Enable, Dial\\r\\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\\r\\nvar dataSMS = '';\\r\\nif (params.AlertSettings.EmergencyNumber) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    phone_number = params.AlertSettings.EmergencyNumber;\\r\\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A1,0,1,${phone_number}`;\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":3},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465137},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4939,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setEnableControl\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\n//create the bit table to use with control\\nvar value = '';\\nif (params.EnableControl.LED == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.Beep == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.Vibration == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.CellTowerLocating == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.WiFi == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.SOSCallSpeaker == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.SideCallSpeaker == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.BLEStayConnected == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.BLELocating == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.SOSCallVoice == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.BLEAlwaysON == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.GPSLocate == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.AlertTCPFast == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue += '0'; //watch only  girar muñeca para iluminar pantalla\\nif (params.EnableControl.Beacon == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue += '0'; // activity fuction, \\n//step counting, \\nif (params.EnableControl.Step == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\n//home-wifi location, data-saver, NLprovider, power control,\\n// sos cancel switch, Long SMS,  plus 7 more without functions\\nvalue += '0000';\\nif (params.EnableControl.StopCallSequence == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue += '00000000';\\nif (params.EnableControl.AutoUpdate == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nif (params.EnableControl.AGPS == 'true') {\\n    value += '1';\\n} else {\\n    value += '0';\\n}\\nvalue = reverseString(value);\\n\\nfunction reverseString(str) {\\n    var newString = \\\"\\\";\\n    for (var i = str.length - 1; i >= 0; i--) {\\n        newString += str[i];\\n    }\\n    return newString;\\n}\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\nvalue = changeEndianness(value);\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '0F';\\nvar messageBody = command + keyLength + key + value;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum);\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\nchecksum = changeEndianness(checksum);\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\\n\\nfunction decimalToBinary(x) {\\n    let bin = 0;\\n    let rem, i = 1,\\n        step = 1;\\n    while (x != 0) {\\n        rem = x % 2;\\n        x = parseInt(x / 2);\\n        bin = bin + rem * i;\\n        i = i * 10;\\n    }\\n    return bin\\n}\\n\\nfunction binaryToHex(x) {\\n    var hexa = parseInt(x, 2).toString(16);\\n    return hexa\\n}\\n\\nfunction changeEndianness(string) {\\n    const result = [];\\n    let len = string.length - 2;\\n    while (len >= 0) {\\n        result.push(string.substr(len, 2));\\n        len -= 2;\\n    }\\n    return result.join('');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465140},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4960,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setGateway\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar messageBody = '02';\\r\\nvar key = '30';\\r\\nvar gateway_number = '00000000000';\\r\\nvar numberHex = '';\\r\\nvar sosKeyLength = '00';\\r\\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.SMSGateway) {\\r\\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\\r\\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\\r\\n    var gateway = gatewayString[1];\\r\\n    gateway_number = gatewayString[0];\\r\\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\\r\\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\\r\\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\\r\\n    messageBody += sosKeyLength + key + confSOS + numberHex;\\r\\n    dataSMS = `A10,0,0,${gateway_number}`; //  doesn't accept SMS+ Untogle Call\\r\\n}\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLength = changeEndianness(totalLength);\\r\\n//totalLength = '1000';  //better to calculate it\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":2},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465142},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4977,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setPerformanceMode\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//Añadir comando para poner modo6 ??\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\nvar command = '02';\\r\\nvar keyLength = '0D';\\r\\nvar key = '44'; // Time interval command\\r\\nvar cycleInterval = 60;\\r\\nvar lazyCycleInterval = 60;\\r\\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240  F0000080;  \\r\\nvar selectedMode = '2'; // Balanced mode\\r\\nif (params.PerformanceSettings.Mode) {\\r\\n    selectedMode = params.PerformanceSettings.Mode;\\r\\n}\\r\\nvar value = '000000'; // Time interval to zero\\r\\nswitch (selectedMode) {\\r\\n    case '0': // No reporting\\r\\n        cycleInterval = 86400; // Time interval to 24 hrs        \\r\\n        lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs        \\r\\n        // HB = 0\\r\\n        break;\\r\\n    case '1': //Power Saving\\r\\n        cycleInterval = 28800; // Time interval to 8 hrs        \\r\\n        lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs     \\r\\n        // HB = 0\\r\\n        break;\\r\\n    case '2': //Balanced\\r\\n        cycleInterval = 600; // Time interval to 10 min            \\r\\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs     \\r\\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\\r\\n        break;\\r\\n    case '3': //High Freq\\r\\n        cycleInterval = 240; // Time interval to 4 min                       \\r\\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\\r\\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \\r\\n        break;\\r\\n    default:\\r\\n        var value = '000000'; // Time interval to zero\\r\\n        //var valueSMS = '';\\r\\n}\\r\\n//Sms Value\\r\\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\\r\\nvar value = parseInt(cycleInterval);\\r\\nif (params.Controls.ConfigurationMode == 'true') {\\r\\n    heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\\r\\n} else {\\r\\n    heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240;  \\r\\n}\\r\\nvalue = decimalToHex(value);\\r\\nvalue = ('000000' + value).slice(-6).toUpperCase();\\r\\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\\r\\nvar valueLazy = parseInt(lazyCycleInterval);\\r\\nvar valueLazy = decimalToHex(valueLazy);\\r\\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\\r\\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\r\\n//How to calculate sequenceID\\r\\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nvar dataSMS = 'mode6' + valueSMS;\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\n//debug(data);\\r\\n//debug(dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465145},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4959,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setServer\",\"TemplateSMS\":\"<<dataSMS>>\",\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//para pruebas en local APN':\\r\\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\\r\\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\\r\\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \\r\\nvar msg = [];\\r\\nvar configs = [];\\r\\nvar configsSMS = [];\\r\\n// configuration command (0X02) APN and Server and Gateway Number\\r\\nvar messageBody = '02';\\r\\n// Server\\r\\nvar domain = '';\\r\\nvar port = '';\\r\\nvar serverLength = '00';\\r\\n// APN\\r\\nvar apn = '';\\r\\nvar apn_password = '';\\r\\nvar apn_username = '';\\r\\nvar apnLength = '00';\\r\\nvar apnUserLength = '00';\\r\\nvar apnPassLength = '00';\\r\\nvar dataSMS = '';\\r\\nif (params.CommunicationSettings.Server) {\\r\\n    var serverString = params.CommunicationSettings.Server.split(',');\\r\\n    domain = serverString[0];\\r\\n    port = serverString[1];\\r\\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\\r\\n    // Server IP and Port\\r\\n    domain = ascii_to_hexa(domain).toUpperCase();\\r\\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\\r\\n    // key 43 and TCP and GPRS is 80\\r\\n    messageBody += serverLength + \\\"4380\\\" + port + domain;\\r\\n    // For SMS\\r\\n    dataSMS = `IP1,${serverString[0]},${serverString[1]}`;\\r\\n}\\r\\nif (params.CommunicationSettings.APN) {\\r\\n    var apnString = params.CommunicationSettings.APN.split(',');\\r\\n    // APN\\r\\n    apn = apnString[0];\\r\\n    apn = ascii_to_hexa(apn).toUpperCase();\\r\\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnLength + \\\"40\\\" + apn;\\r\\n    // APN username\\r\\n    apn_username = apnString[1];\\r\\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\\r\\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnUserLength + \\\"41\\\" + apn_username;\\r\\n    // APN passwprd\\r\\n    apn_password = apnString[2];\\r\\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\\r\\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\\r\\n    messageBody += apnPassLength + \\\"42\\\" + apn_password;\\r\\n}\\r\\n// create HEADER\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\\r\\ntotalLenght = changeEndianness(totalLenght);\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\n// For GPRS command\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\n// For SMS command\\r\\nAddValueSMS('dataSMS', dataSMS);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs,\\r\\n    configsSMS: configsSMS\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n// functions\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction AddValueSMS(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configsSMS.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":1},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465147},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4931,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSOSOption\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar talkTime = 65534\\ntalkTime = decimalToHex(talkTime)\\ntalkTime = ('0000' + talkTime).slice(-4).toUpperCase()\\ntalkTime = changeEndianness(talkTime)\\nif (params.SOSButtonSettings.RingTime) {\\n    var ringTime = params.SOSButtonSettings.RingTime\\n    ringTime = parseInt(ringTime)\\n    ringTime = decimalToHex(ringTime)\\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase()\\n} else {\\n    var ringTime = 20;\\n    ringTime = decimalToHex(ringTime);\\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase();\\n}\\nif (params.SOSButtonSettings.Retries) {\\n    var tries = params.SOSButtonSettings.Retries\\n    tries = parseInt(tries)\\n    tries = decimalToHex(tries)\\n    tries = ('00' + tries).slice(-2).toUpperCase()\\n} else {\\n    var tries = '01';\\n}\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\\nvar command = '02'\\nvar keyLength = '05'\\nvar key = '32'\\nvar messageBody = command + keyLength + key + talkTime + ringTime + tries\\nvar checksum = byteStringToByteArray(messageBody)\\nchecksum = crc16byte(checksum)\\nchecksum = decimalToHex(checksum).toUpperCase()\\nchecksum = ('0000' + checksum).slice(-4)\\nchecksum = changeEndianness(checksum)\\n//Hpw to calculate sequenceID\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID\\nvar data = prefix + messageBody\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID); //add 20/07\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\\n\\nfunction changeEndianness(string) {\\n    const result = [];\\n    let len = string.length - 2;\\n    while (len >= 0) {\\n        result.push(string.substr(len, 2));\\n        len -= 2;\\n    }\\n    return result.join('');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465150},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":5013,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setSystemSettings\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\n//create the bit table to use with control\\r\\nvar value = '00000000000000000100'; // A1 phone monitor Enable as default documentation\\r\\nif (params.SystemSettings.AllowList == 'true') { // Enable SMS Whitelist Setting\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\n//if (params.PhoneSettings.SilentCallMode == 'true') {\\r\\n//    value += '1';\\r\\n//} else {\\r\\nvalue += '0';\\r\\n//}\\r\\n//if (params.PhoneSettings.ButtonHangUp == 'true') {\\r\\n//    value += '1';\\r\\n//} else {\\r\\nvalue += '1'; // ButtonHangUp Default True\\r\\n//}\\r\\nif (params.SystemSettings.AllowList == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.SystemSettings.AutoAnswer == 'true') {\\r\\n    value += '1';\\r\\n    //  if (params.PhoneSettings.AutoAnswerAfterRings) {\\r\\n    //        value += ('0000000' + decimalToBinary(parseInt(params.PhoneSettings.AutoAnswerAfterRings))).slice(-7);\\r\\n    //   } else {\\r\\n    value += ('0000011'); // default 3\\r\\n    // }\\r\\n} else {\\r\\n    value += '00000000';\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '33';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('')\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF)\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = [];\\r\\n    var j = 0;\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2);\\r\\n        j++;\\r\\n    }\\r\\n    var bytes = [];\\r\\n    var bytePos = 0;\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i];\\r\\n        var b = parseInt(byteStr, 16);\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b;\\r\\n            bytePos++;\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('')\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":3,\"Order\":3},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465152},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4944,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setVoicePrompt\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\n//create the bit table to use with control\\r\\nvar value = '';\\r\\nif (params.VoicePrompt.Beep == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.TiltCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Charging == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Battery == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call1 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call2 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call3 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call4 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call5 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Fall == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.SOS == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Click == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.NoMotion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Motion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Tilt == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Activity == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Find == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call6 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Time == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined  bit 20\\r\\nif (params.VoicePrompt.CallError == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallDisconnected == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallHang == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call7 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call8 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call9 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call10 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmComplete == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BLE == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BaseLocation == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined bit 31\\r\\nvalue = reverseString(value);\\r\\n\\r\\nfunction reverseString(str) {\\r\\n    var newString = \\\"\\\";\\r\\n    for (var i = str.length - 1; i >= 0; i--) {\\r\\n        newString += str[i];\\r\\n    }\\r\\n    return newString;\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '19';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465155},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":1}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465192},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465248},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465290},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":null,\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465339},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465385},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465832},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":{\"Id\":4946,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setCustom ID\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\nvar configs = [];\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar key = '47';\\nif (params.CustomID.CustomID == 'true') {\\n    var keyLength = '02';\\n    var customID = '06';\\n    var totalLenght = '0400';\\n} else {\\n    var keyLength = '01';\\n    var customID = '';\\n    var totalLenght = '0300';\\n}\\nvar messageBody = command + keyLength + key + customID;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum).toUpperCase();\\nchecksum = ('0000' + checksum).slice(-4);\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\\nvar data = prefix + messageBody;\\n// For GPRS command\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = []\\n    var j = 0\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2)\\n        j++\\n    }\\n    var bytes = []\\n    var bytePos = 0\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i]\\n        var b = parseInt(byteStr, 16)\\n        if (b < 256) {\\n            bytes[bytePos] = b\\n            bytePos++\\n        }\\n    }\\n    return bytes\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":5},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760465836},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760526068},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760527185},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":{\"Id\":5814,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setVoicePromptExtra\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\n// [Length]:05 [Key]:76 [Value]:07 00 00 00\\r\\n//{\\\"musicExtend\\\":{\\\"bit29\\\":0,\\\"bit27\\\":0,\\\"bit28\\\":0,\\\"bit25\\\":0,\\\"bit26\\\":0,\\\"flagValue\\\":7,\\\"bit23\\\":0,\\\"bit24\\\":0,\\\"bit21\\\":0,\\\"bit22\\\":0,\\\"bit20\\\":0,\\\"bit9\\\":0,\\\"bit18\\\":0,\\\"bit19\\\":0,\\\"bit7\\\":0,\\\"bit16\\\":0,\\\"bit8\\\":0,\\\"bit17\\\":0,\\\"bit5\\\":0,\\\"bit14\\\":0,\\\"bit6\\\":0,\\\"bit15\\\":0,\\\"bit3\\\":0,\\\"bit4\\\":0,\\\"bit1\\\":1,\\\"bit2\\\":1,\\\"bit0\\\":1,\\\"bit12\\\":0,\\\"bit13\\\":0,\\\"bit10\\\":0,\\\"bit11\\\":0,\\\"bit30\\\":0,\\\"bit31\\\":0}}\\r\\nvar value = '07000000';\\r\\n/* create the bit table to use with control\\r\\nvar value = '';\\r\\nif (params.VoicePrompt.Beep == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.TiltCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Charging == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Battery == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call1 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call2 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call3 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call4 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call5 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Fall == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.SOS == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Click == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.NoMotion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Motion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Tilt == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Activity == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Find == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call6 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Time == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined  bit 20\\r\\nif (params.VoicePrompt.CallError == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallDisconnected == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallHang == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call7 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call8 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call9 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call10 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmComplete == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BLE == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BaseLocation == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined bit 31\\r\\nvalue = reverseString(value);\\r\\n\\r\\nfunction reverseString(str) {\\r\\n    var newString = \\\"\\\";\\r\\n    for (var i = str.length - 1; i >= 0; i--) {\\r\\n        newString += str[i];\\r\\n    }\\r\\n    return newString;\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value); */\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '76';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":10},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760527189},{"Type":2,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":{\"Id\":4944,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.6\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setVoicePrompt\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\r\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\r\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\r\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\r\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\r\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\r\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\r\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\r\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\r\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\r\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\r\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\r\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\r\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\r\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\r\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\r\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\r\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\r\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\r\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\r\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\r\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\r\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\r\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\r\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\r\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\r\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\r\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\r\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\r\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\r\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\r\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\r\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\r\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\r\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\r\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\r\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\r\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\r\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\r\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\r\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\r\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\r\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\r\\n];\\r\\nvar configs = [];\\r\\n//create the bit table to use with control\\r\\nvar value = '';\\r\\nif (params.VoicePrompt.Beep == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.TiltCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Charging == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Battery == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call1 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call2 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call3 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call4 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call5 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Fall == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.SOS == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Click == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.NoMotion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Motion == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Tilt == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Activity == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Find == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call6 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmCancel == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Time == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined  bit 20\\r\\nif (params.VoicePrompt.CallError == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallDisconnected == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.CallHang == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call7 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call8 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call9 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.Call10 == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.AlarmComplete == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BLE == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nif (params.VoicePrompt.BaseLocation == 'true') {\\r\\n    value += '1';\\r\\n} else {\\r\\n    value += '0';\\r\\n}\\r\\nvalue += '0'; // not defined bit 31\\r\\nvalue = reverseString(value);\\r\\n\\r\\nfunction reverseString(str) {\\r\\n    var newString = \\\"\\\";\\r\\n    for (var i = str.length - 1; i >= 0; i--) {\\r\\n        newString += str[i];\\r\\n    }\\r\\n    return newString;\\r\\n}\\r\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\r\\nvalue = changeEndianness(value);\\r\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\r\\nvar command = '02';\\r\\nvar keyLength = '05';\\r\\nvar key = '19';\\r\\nvar messageBody = command + keyLength + key + value;\\r\\nvar checksum = byteStringToByteArray(messageBody);\\r\\nchecksum = crc16byte(checksum);\\r\\nchecksum = decimalToHex(checksum);\\r\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\r\\nchecksum = changeEndianness(checksum);\\r\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\r\\nvar data = prefix + messageBody;\\r\\nAddValue('data', data);\\r\\nAddValue('sequenceNumber', sequenceID);\\r\\nvar commandConfigs = {\\r\\n    template: \\\"main\\\",\\r\\n    configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n    var cvpair = {\\r\\n        code: p1,\\r\\n        value: p2\\r\\n    };\\r\\n    configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction ascii_to_hexa(str) {\\r\\n    var arr1 = [];\\r\\n    for (var n = 0, l = str.length; n < l; n++) {\\r\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\r\\n        arr1.push(hex);\\r\\n    }\\r\\n    return arr1.join('');\\r\\n}\\r\\n\\r\\nfunction crc16byte(s) {\\r\\n    var crc = 0x0000;\\r\\n    var j, i;\\r\\n    for (i = 0; i < s.length; i++) {\\r\\n        c = s[i];\\r\\n        if (c > 255) {\\r\\n            throw new RangeError();\\r\\n        }\\r\\n        j = (c ^ (crc >> 8)) & 0xFF;\\r\\n        crc = crcTable[j] ^ (crc << 8);\\r\\n    }\\r\\n    return ((crc ^ 0) & 0xFFFF);\\r\\n}\\r\\n\\r\\nfunction byteStringToByteArray(str) {\\r\\n    var splitStr = []\\r\\n    var j = 0\\r\\n    for (let i = 0; i < str.length; i += 2) {\\r\\n        splitStr[j] = str.substring(i, i + 2)\\r\\n        j++\\r\\n    }\\r\\n    var bytes = []\\r\\n    var bytePos = 0\\r\\n    for (let i = 0; i < splitStr.length; i++) {\\r\\n        var byteStr = splitStr[i]\\r\\n        var b = parseInt(byteStr, 16)\\r\\n        if (b < 256) {\\r\\n            bytes[bytePos] = b\\r\\n            bytePos++\\r\\n        }\\r\\n    }\\r\\n    return bytes\\r\\n}\\r\\n\\r\\nfunction decimalToHex(str) {\\r\\n    hexString = str.toString(16);\\r\\n    return hexString\\r\\n}\\r\\n\\r\\nfunction decimalToBinary(x) {\\r\\n    let bin = 0;\\r\\n    let rem, i = 1,\\r\\n        step = 1;\\r\\n    while (x != 0) {\\r\\n        rem = x % 2;\\r\\n        x = parseInt(x / 2);\\r\\n        bin = bin + rem * i;\\r\\n        i = i * 10;\\r\\n    }\\r\\n    return bin\\r\\n}\\r\\n\\r\\nfunction binaryToHex(x) {\\r\\n    var hexa = parseInt(x, 2).toString(16);\\r\\n    return hexa\\r\\n}\\r\\n\\r\\nfunction changeEndianness(string) {\\r\\n    const result = [];\\r\\n    let len = string.length - 2;\\r\\n    while (len >= 0) {\\r\\n        result.push(string.substr(len, 2));\\r\\n        len -= 2;\\r\\n    }\\r\\n    return result.join('');\\r\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":2,\"Order\":null},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760527192},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1760602509},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check box to convert Rio to Roam\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761240479},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check the box to convert Rio to Roam\\\\nfirmware must be on version V04b.8601.2411.1.0.16.4411.2409.25 or greater \\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761662730},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check the box to convert Rio to Roam\\\\nfirmware must be on version V04b.8601.2411.1.0.16.4411.2409.25 or greater \\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761679443},{"Type":0,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check the box to convert Rio to Roam\\\\nfirmware must be on version V04b.8601.2411.1.0.16.4411.2409.25 or greater \\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":{\"Id\":4928,\"Protocol\":{\"Id\":224,\"Code\":\"Access TEC Roam\",\"Version\":\"1.7\",\"FirmwareVersion\":\"V04b.8601.2411.1.0.16.4411.2409.25\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"setPowerAlert\",\"TemplateSMS\":null,\"Template\":\"<<data>>\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\\n];\\n// [Length]:05 [Key]:50 [Value]:14 00 00 E0\\n//{\\\"powerLowAlert\\\":{\\\"powerONSMS\\\":0,\\\"voice\\\":0,\\\"powerOFFSMS\\\":0,\\\"powerON\\\":1,\\\"voiceStatus\\\":0,\\\"powerOFF\\\":1,\\\"powerOFFLoc\\\":0,\\\"power\\\":20,\\\"status\\\":1}}\\nvar value = '140000E0';\\n/*\\nif (params.PowerAlert.EnableDisablePowerAlert == 'true') {\\n    if (params.PowerAlert.PowerOff == 'true') {\\n        value += '1';\\n    } else {\\n        value += '0';\\n    }\\n    if (params.PowerAlert.PowerOn == 'true') {\\n        value += '1';\\n    } else {\\n        value += '0';\\n    }\\n    if (params.PowerAlert.PowerLow == 'true') {\\n        value += '1';\\n    } else {\\n        value += '0';\\n    }\\n    value += '0';\\n    value += '000000000000';\\n    value += '00000000';\\n    if (params.PowerAlert.LowPowerThreshold) {\\n        var threshold = ('00000000' + decimalToBinary(params.PowerAlert.LowPowerThreshold)).slice(-8);\\n        value += threshold;\\n    } else {\\n        value += '00001111';\\n    }\\n} else {\\n    value = '00000000000000000000000000000000';\\n}\\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\\nvalue = value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2); */\\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\\nvar command = '02';\\nvar keyLength = '05';\\nvar key = '50';\\nvar messageBody = command + keyLength + key + value;\\nvar checksum = byteStringToByteArray(messageBody);\\nchecksum = crc16byte(checksum);\\nchecksum = decimalToHex(checksum);\\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\\nvar data = prefix + messageBody;\\nAddValue('data', data);\\nAddValue('sequenceNumber', sequenceID);\\nvar commandConfigs = {\\n    template: \\\"main\\\",\\n    configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n    var cvpair = {\\n        code: p1,\\n        value: p2\\n    };\\n    configs.push(cvpair);\\n}\\n\\nfunction ascii_to_hexa(str) {\\n    var arr1 = [];\\n    for (var n = 0, l = str.length; n < l; n++) {\\n        var hex = Number(str.charCodeAt(n)).toString(16);\\n        arr1.push(hex);\\n    }\\n    return arr1.join('');\\n}\\n\\nfunction crc16byte(s) {\\n    var crc = 0x0000;\\n    var j, i;\\n    for (i = 0; i < s.length; i++) {\\n        c = s[i];\\n        if (c > 255) {\\n            throw new RangeError();\\n        }\\n        j = (c ^ (crc >> 8)) & 0xFF;\\n        crc = crcTable[j] ^ (crc << 8);\\n    }\\n    return ((crc ^ 0) & 0xFFFF);\\n}\\n\\nfunction byteStringToByteArray(str) {\\n    var splitStr = [];\\n    var j = 0;\\n    for (let i = 0; i < str.length; i += 2) {\\n        splitStr[j] = str.substring(i, i + 2);\\n        j++;\\n    }\\n    var bytes = [];\\n    var bytePos = 0;\\n    for (let i = 0; i < splitStr.length; i++) {\\n        var byteStr = splitStr[i];\\n        var b = parseInt(byteStr, 16);\\n        if (b < 256) {\\n            bytes[bytePos] = b;\\n            bytePos++;\\n        }\\n    }\\n    return bytes;\\n}\\n\\nfunction decimalToHex(str) {\\n    hexString = str.toString(16);\\n    return hexString;\\n}\\n\\nfunction decimalToBinary(x) {\\n    let bin = 0;\\n    let rem, i = 1,\\n        step = 1;\\n    while (x !== 0) {\\n        rem = x % 2;\\n        x = parseInt(x / 2);\\n        bin = bin + rem * i;\\n        i = i * 10;\\n    }\\n    return bin;\\n}\\n\\nfunction binaryToHex(x) {\\n    var hexa = parseInt(x, 2).toString(16);\\n    return hexa;\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":11},\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761679447},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Convert Rio to Roam\",\"Json\":\"{\\\"name\\\":\\\"Convert Rio to Roam\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Convert Rio to Roam\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check the box to convert Rio to Roam\\\\nfirmware must be on version V04b.8601.2411.1.0.16.4411.2409.25 or greater \\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761815782},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Factory Defaults\",\"Json\":\"{\\\"name\\\":\\\"Factory Defaults\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Factory Defaults\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check this box to send Factory Defaults to the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761816026},{"Type":1,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Factory Defaults\",\"Json\":\"{\\\"name\\\":\\\"Factory Defaults\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Factory Defaults\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check this box to send Factory Defaults to the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1761816069},{"Type":2,"NewValue":"{\"Id\":12385,\"Group\":{\"Id\":6207,\"Name\":\"Controls\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Factory Defaults\",\"Json\":\"{\\\"name\\\":\\\"Factory Defaults\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Factory Defaults\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Check this box to send Factory Defaults to the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":2}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1771525837}],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4925,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setContinuousLocate","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nif (params.ContinuousLocate.Interval) {\n    var Interval = parseInt(params.ContinuousLocate.Interval) * 60;\n    Interval = decimalToHex(Interval);\n    Interval = ('0000' + Interval).slice(-4).toUpperCase();\n    Interval = Interval.substring(2, 4) + Interval.substring(0, 2);\n}\nif (params.ContinuousLocate.Duration) {\n    var Duration = parseInt(params.ContinuousLocate.Duration) * 60;\n    Duration = decimalToHex(Duration);\n    Duration = ('0000' + Duration).slice(-4).toUpperCase();\n    Duration = Duration.substring(2, 4) + Duration.substring(0, 2);\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '45';\nvar messageBody = command + keyLength + key + Interval + Duration;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4962,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setEmergencySettings","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '30';\r\nvar phone_number = '00000000000';\r\nvar numberHex = '';\r\nvar sosKeyLength = '00';\r\n//var confFall = '1100'; // Enable, Dial\r\nvar confSOS = '10100000'; // Enable, no SMS, Toggle Call, No Sim Dialing, Contact Number 1\r\nvar dataSMS = '';\r\nif (params.AlertSettings.EmergencyNumber) {\r\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n    phone_number = params.AlertSettings.EmergencyNumber;\r\n    numberHex = ascii_to_hexa(phone_number).toUpperCase();\r\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\n    messageBody += sosKeyLength + key + confSOS + numberHex;\r\n    dataSMS = `A1,0,1,${phone_number}`;\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000';  //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":3},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4939,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setEnableControl","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n//create the bit table to use with control\nvar value = '';\nif (params.EnableControl.LED == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.Beep == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.Vibration == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.CellTowerLocating == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.WiFi == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.SOSCallSpeaker == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.SideCallSpeaker == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.BLEStayConnected == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.BLELocating == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.SOSCallVoice == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.BLEAlwaysON == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.GPSLocate == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.AlertTCPFast == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue += '0'; //watch only  girar muñeca para iluminar pantalla\nif (params.EnableControl.Beacon == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue += '0'; // activity fuction, \n//step counting, \nif (params.EnableControl.Step == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\n//home-wifi location, data-saver, NLprovider, power control,\n// sos cancel switch, Long SMS,  plus 7 more without functions\nvalue += '0000';\nif (params.EnableControl.StopCallSequence == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue += '00000000';\nif (params.EnableControl.AutoUpdate == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nif (params.EnableControl.AGPS == 'true') {\n    value += '1';\n} else {\n    value += '0';\n}\nvalue = reverseString(value);\n\nfunction reverseString(str) {\n    var newString = \"\";\n    for (var i = str.length - 1; i >= 0; i--) {\n        newString += str[i];\n    }\n    return newString;\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\nvalue = changeEndianness(value);\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '0F';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = changeEndianness(checksum);\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x != 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4960,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setGateway","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar messageBody = '02';\r\nvar key = '30';\r\nvar gateway_number = '00000000000';\r\nvar numberHex = '';\r\nvar sosKeyLength = '00';\r\nvar confSOS = '10001001'; // Enable + doesn't accept SMS+ Untogle Call,  No SIM Dialing + Contact Number 10\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.SMSGateway) {\r\n    confSOS = ('00' + binaryToHex(confSOS)).slice(-2).toUpperCase();\r\n    var gatewayString = params.CommunicationSettings.SMSGateway.split(',');\r\n    var gateway = gatewayString[1];\r\n    gateway_number = gatewayString[0];\r\n    numberHex = ascii_to_hexa(gateway_number).toUpperCase();\r\n    //numberLength = ('00' + decimalToHex(gateway_number.length)).slice(-2).toUpperCase();\r\n    sosKeyLength = ('00' + decimalToHex(2 + (numberHex.length / 2))).slice(-2).toUpperCase();\r\n    messageBody += sosKeyLength + key + confSOS + numberHex;\r\n    dataSMS = `A10,0,0,${gateway_number}`; //  doesn't accept SMS+ Untogle Call\r\n}\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLength = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLength = changeEndianness(totalLength);\r\n//totalLength = '1000';  //better to calculate it\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLength + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":2},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4977,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setPerformanceMode","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//Añadir comando para poner modo6 ??\r\nvar configs = [];\r\nvar configsSMS = [];\r\nvar command = '02';\r\nvar keyLength = '0D';\r\nvar key = '44'; // Time interval command\r\nvar cycleInterval = 60;\r\nvar lazyCycleInterval = 60;\r\nvar heartBeatStatus = '00000000'; //heartbeat OFF and heartBeat = 0; heartbeat ON and heartBeat = 240  F0000080;  \r\nvar selectedMode = '2'; // Balanced mode\r\nif (params.PerformanceSettings.Mode) {\r\n    selectedMode = params.PerformanceSettings.Mode;\r\n}\r\nvar value = '000000'; // Time interval to zero\r\nswitch (selectedMode) {\r\n    case '0': // No reporting\r\n        cycleInterval = 86400; // Time interval to 24 hrs        \r\n        lazyCycleInterval = 86400; // Lazy Time interval to 24 hrs        \r\n        // HB = 0\r\n        break;\r\n    case '1': //Power Saving\r\n        cycleInterval = 28800; // Time interval to 8 hrs        \r\n        lazyCycleInterval = 43200; // Lazy Time interval to 12 hrs     \r\n        // HB = 0\r\n        break;\r\n    case '2': //Balanced\r\n        cycleInterval = 600; // Time interval to 10 min            \r\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs     \r\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240\r\n        break;\r\n    case '3': //High Freq\r\n        cycleInterval = 240; // Time interval to 4 min                       \r\n        lazyCycleInterval = 3600; // Lazy Time interval to 1 hrs\r\n        //heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240 \r\n        break;\r\n    default:\r\n        var value = '000000'; // Time interval to zero\r\n        //var valueSMS = '';\r\n}\r\n//Sms Value\r\nvar valueSMS = ',' + cycleInterval + 'S,' + lazyCycleInterval + 'S';\r\nvar value = parseInt(cycleInterval);\r\nif (params.Controls.ConfigurationMode == 'true') {\r\n    heartBeatStatus = '3C000080'; //heartbeat ON and heartBeat = 60;\r\n} else {\r\n    heartBeatStatus = 'F0000080'; //heartbeat ON and heartBeat = 240;  \r\n}\r\nvalue = decimalToHex(value);\r\nvalue = ('000000' + value).slice(-6).toUpperCase();\r\nvalue = value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2);\r\nvar valueLazy = parseInt(lazyCycleInterval);\r\nvar valueLazy = decimalToHex(valueLazy);\r\nvalueLazy = ('000000' + valueLazy).slice(-6).toUpperCase();\r\nvalueLazy = valueLazy.substring(4, 6) + valueLazy.substring(2, 4) + valueLazy.substring(0, 2);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar messageBody = command + keyLength + key + heartBeatStatus + value + '00' + valueLazy + '00';\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\r\n//How to calculate sequenceID\r\nvar prefix = 'AB10' + '0F00' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nvar dataSMS = 'mode6' + valueSMS;\r\nAddValueSMS('dataSMS', dataSMS);\r\n//debug(data);\r\n//debug(dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4959,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setServer","TemplateSMS":"<<dataSMS>>","Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//para pruebas en local APN':\r\n//var params = {CommunicationSettings:{'SMSGateway':'+34666777888,Esendex','APN':'','APNOld':'','Server':'52.174.17.77,5678','ServerOld':''}}\r\n// AB101B 0066840300 021043802E1635322E3137342E31372E373704406D326D01410142\r\n// AB1015 00 66 84 F5 4B 02 10 43 80 2E 16 35 32 2E 31 37 34 2E 31 37 2E 37 37 04 40 6D 32 6D 01 41 01 42                  \r\nvar msg = [];\r\nvar configs = [];\r\nvar configsSMS = [];\r\n// configuration command (0X02) APN and Server and Gateway Number\r\nvar messageBody = '02';\r\n// Server\r\nvar domain = '';\r\nvar port = '';\r\nvar serverLength = '00';\r\n// APN\r\nvar apn = '';\r\nvar apn_password = '';\r\nvar apn_username = '';\r\nvar apnLength = '00';\r\nvar apnUserLength = '00';\r\nvar apnPassLength = '00';\r\nvar dataSMS = '';\r\nif (params.CommunicationSettings.Server) {\r\n    var serverString = params.CommunicationSettings.Server.split(',');\r\n    domain = serverString[0];\r\n    port = serverString[1];\r\n    port = changeEndianness(decimalToHex(parseInt(port))).toUpperCase();\r\n    // Server IP and Port\r\n    domain = ascii_to_hexa(domain).toUpperCase();\r\n    serverLength = ('00' + decimalToHex(2 + port.length / 2 + domain.length / 2)).slice(-2).toUpperCase();\r\n    // key 43 and TCP and GPRS is 80\r\n    messageBody += serverLength + \"4380\" + port + domain;\r\n    // For SMS\r\n    dataSMS = `IP1,${serverString[0]},${serverString[1]}`;\r\n}\r\nif (params.CommunicationSettings.APN) {\r\n    var apnString = params.CommunicationSettings.APN.split(',');\r\n    // APN\r\n    apn = apnString[0];\r\n    apn = ascii_to_hexa(apn).toUpperCase();\r\n    apnLength = ('00' + decimalToHex(1 + apn.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnLength + \"40\" + apn;\r\n    // APN username\r\n    apn_username = apnString[1];\r\n    apn_username = ascii_to_hexa(apn_username).toUpperCase();\r\n    apnUserLength = ('00' + decimalToHex(1 + apn_username.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnUserLength + \"41\" + apn_username;\r\n    // APN passwprd\r\n    apn_password = apnString[2];\r\n    apn_password = ascii_to_hexa(apn_password).toUpperCase();\r\n    apnPassLength = ('00' + decimalToHex(1 + apn_password.length / 2)).slice(-2).toUpperCase();\r\n    messageBody += apnPassLength + \"42\" + apn_password;\r\n}\r\n// create HEADER\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\n// For GPRS command\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\n// For SMS command\r\nAddValueSMS('dataSMS', dataSMS);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs,\r\n    configsSMS: configsSMS\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n// functions\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction AddValueSMS(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configsSMS.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4931,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setSOSOption","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar talkTime = 65534\ntalkTime = decimalToHex(talkTime)\ntalkTime = ('0000' + talkTime).slice(-4).toUpperCase()\ntalkTime = changeEndianness(talkTime)\nif (params.SOSButtonSettings.RingTime) {\n    var ringTime = params.SOSButtonSettings.RingTime\n    ringTime = parseInt(ringTime)\n    ringTime = decimalToHex(ringTime)\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase()\n} else {\n    var ringTime = 20;\n    ringTime = decimalToHex(ringTime);\n    ringTime = ('00' + ringTime).slice(-2).toUpperCase();\n}\nif (params.SOSButtonSettings.Retries) {\n    var tries = params.SOSButtonSettings.Retries\n    tries = parseInt(tries)\n    tries = decimalToHex(tries)\n    tries = ('00' + tries).slice(-2).toUpperCase()\n} else {\n    var tries = '01';\n}\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase()\nvar command = '02'\nvar keyLength = '05'\nvar key = '32'\nvar messageBody = command + keyLength + key + talkTime + ringTime + tries\nvar checksum = byteStringToByteArray(messageBody)\nchecksum = crc16byte(checksum)\nchecksum = decimalToHex(checksum).toUpperCase()\nchecksum = ('0000' + checksum).slice(-4)\nchecksum = changeEndianness(checksum)\n//Hpw to calculate sequenceID\nvar prefix = 'AB10' + '0700' + checksum + sequenceID\nvar data = prefix + messageBody\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID); //add 20/07\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}\n\nfunction changeEndianness(string) {\n    const result = [];\n    let len = string.length - 2;\n    while (len >= 0) {\n        result.push(string.substr(len, 2));\n        len -= 2;\n    }\n    return result.join('');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":5013,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setSystemSettings","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create the bit table to use with control\r\nvar value = '00000000000000000100'; // A1 phone monitor Enable as default documentation\r\nif (params.SystemSettings.AllowList == 'true') { // Enable SMS Whitelist Setting\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\n//if (params.PhoneSettings.SilentCallMode == 'true') {\r\n//    value += '1';\r\n//} else {\r\nvalue += '0';\r\n//}\r\n//if (params.PhoneSettings.ButtonHangUp == 'true') {\r\n//    value += '1';\r\n//} else {\r\nvalue += '1'; // ButtonHangUp Default True\r\n//}\r\nif (params.SystemSettings.AllowList == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.SystemSettings.AutoAnswer == 'true') {\r\n    value += '1';\r\n    //  if (params.PhoneSettings.AutoAnswerAfterRings) {\r\n    //        value += ('0000000' + decimalToBinary(parseInt(params.PhoneSettings.AutoAnswerAfterRings))).slice(-7);\r\n    //   } else {\r\n    value += ('0000011'); // default 3\r\n    // }\r\n} else {\r\n    value += '00000000';\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '33';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('')\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF)\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('')\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":3,"Order":3},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"\",\"description\":null,\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4944,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setVoicePrompt","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\n//create the bit table to use with control\r\nvar value = '';\r\nif (params.VoicePrompt.Beep == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.TiltCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Charging == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Battery == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call1 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call2 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call3 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call4 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call5 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Fall == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.SOS == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Click == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.NoMotion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Motion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Tilt == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Activity == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Find == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call6 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Time == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined  bit 20\r\nif (params.VoicePrompt.CallError == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallDisconnected == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallHang == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call7 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call8 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call9 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call10 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmComplete == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BLE == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BaseLocation == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined bit 31\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n    var newString = \"\";\r\n    for (var i = str.length - 1; i >= 0; i--) {\r\n        newString += str[i];\r\n    }\r\n    return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value);\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '19';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"true\",\"description\":\"Convert Rio to Roam\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Check box to convert Rio to Roam\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":{"Id":4946,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setCustom ID","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\nvar configs = [];\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar key = '47';\nif (params.CustomID.CustomID == 'true') {\n    var keyLength = '02';\n    var customID = '06';\n    var totalLenght = '0400';\n} else {\n    var keyLength = '01';\n    var customID = '';\n    var totalLenght = '0300';\n}\nvar messageBody = command + keyLength + key + customID;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum).toUpperCase();\nchecksum = ('0000' + checksum).slice(-4);\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\nvar data = prefix + messageBody;\n// For GPRS command\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = []\n    var j = 0\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2)\n        j++\n    }\n    var bytes = []\n    var bytePos = 0\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i]\n        var b = parseInt(byteStr, 16)\n        if (b < 256) {\n            bytes[bytePos] = b\n            bytePos++\n        }\n    }\n    return bytes\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":5},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"true\",\"description\":\"Convert Rio to Roam\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Check box to convert Rio to Roam\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":{"Id":5814,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.6","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setVoicePromptExtra","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\nvar configs = [];\r\n// [Length]:05 [Key]:76 [Value]:07 00 00 00\r\n//{\"musicExtend\":{\"bit29\":0,\"bit27\":0,\"bit28\":0,\"bit25\":0,\"bit26\":0,\"flagValue\":7,\"bit23\":0,\"bit24\":0,\"bit21\":0,\"bit22\":0,\"bit20\":0,\"bit9\":0,\"bit18\":0,\"bit19\":0,\"bit7\":0,\"bit16\":0,\"bit8\":0,\"bit17\":0,\"bit5\":0,\"bit14\":0,\"bit6\":0,\"bit15\":0,\"bit3\":0,\"bit4\":0,\"bit1\":1,\"bit2\":1,\"bit0\":1,\"bit12\":0,\"bit13\":0,\"bit10\":0,\"bit11\":0,\"bit30\":0,\"bit31\":0}}\r\nvar value = '07000000';\r\n/* create the bit table to use with control\r\nvar value = '';\r\nif (params.VoicePrompt.Beep == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.TiltCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Charging == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Battery == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call1 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call2 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call3 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call4 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call5 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Fall == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.SOS == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Click == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.NoMotion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Motion == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Tilt == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Activity == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Find == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call6 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmCancel == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Time == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined  bit 20\r\nif (params.VoicePrompt.CallError == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallDisconnected == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.CallHang == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call7 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call8 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call9 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.Call10 == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.AlarmComplete == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BLE == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nif (params.VoicePrompt.BaseLocation == 'true') {\r\n    value += '1';\r\n} else {\r\n    value += '0';\r\n}\r\nvalue += '0'; // not defined bit 31\r\nvalue = reverseString(value);\r\n\r\nfunction reverseString(str) {\r\n    var newString = \"\";\r\n    for (var i = str.length - 1; i >= 0; i--) {\r\n        newString += str[i];\r\n    }\r\n    return newString;\r\n}\r\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\r\nvalue = changeEndianness(value); */\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\nvar command = '02';\r\nvar keyLength = '05';\r\nvar key = '76';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = []\r\n    var j = 0\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2)\r\n        j++\r\n    }\r\n    var bytes = []\r\n    var bytePos = 0\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i]\r\n        var b = parseInt(byteStr, 16)\r\n        if (b < 256) {\r\n            bytes[bytePos] = b\r\n            bytePos++\r\n        }\r\n    }\r\n    return bytes\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x != 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":10},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12385,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Convert Rio to Roam","Json":"{\"name\":\"Convert Rio to Roam\",\"default\":\"true\",\"description\":\"Convert Rio to Roam\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Check the box to convert Rio to Roam\\nfirmware must be on version V04b.8601.2411.1.0.16.4411.2409.25 or greater \",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":{"Id":4928,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.7","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"setPowerAlert","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"var configs = [];\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n// [Length]:05 [Key]:50 [Value]:14 00 00 E0\n//{\"powerLowAlert\":{\"powerONSMS\":0,\"voice\":0,\"powerOFFSMS\":0,\"powerON\":1,\"voiceStatus\":0,\"powerOFF\":1,\"powerOFFLoc\":0,\"power\":20,\"status\":1}}\nvar value = '140000E0';\n/*\nif (params.PowerAlert.EnableDisablePowerAlert == 'true') {\n    if (params.PowerAlert.PowerOff == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    if (params.PowerAlert.PowerOn == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    if (params.PowerAlert.PowerLow == 'true') {\n        value += '1';\n    } else {\n        value += '0';\n    }\n    value += '0';\n    value += '000000000000';\n    value += '00000000';\n    if (params.PowerAlert.LowPowerThreshold) {\n        var threshold = ('00000000' + decimalToBinary(params.PowerAlert.LowPowerThreshold)).slice(-8);\n        value += threshold;\n    } else {\n        value += '00001111';\n    }\n} else {\n    value = '00000000000000000000000000000000';\n}\nvalue = ('00000000' + binaryToHex(value)).slice(-8).toUpperCase();\nvalue = value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4) + value.substring(0, 2); */\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\nvar command = '02';\nvar keyLength = '05';\nvar key = '50';\nvar messageBody = command + keyLength + key + value;\nvar checksum = byteStringToByteArray(messageBody);\nchecksum = crc16byte(checksum);\nchecksum = decimalToHex(checksum);\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\nchecksum = checksum.toString().substring(2, 4) + checksum.toString().substring(0, 2);\nvar prefix = 'AB10' + '0700' + checksum + sequenceID;\nvar data = prefix + messageBody;\nAddValue('data', data);\nAddValue('sequenceNumber', sequenceID);\nvar commandConfigs = {\n    template: \"main\",\n    configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n    var cvpair = {\n        code: p1,\n        value: p2\n    };\n    configs.push(cvpair);\n}\n\nfunction ascii_to_hexa(str) {\n    var arr1 = [];\n    for (var n = 0, l = str.length; n < l; n++) {\n        var hex = Number(str.charCodeAt(n)).toString(16);\n        arr1.push(hex);\n    }\n    return arr1.join('');\n}\n\nfunction crc16byte(s) {\n    var crc = 0x0000;\n    var j, i;\n    for (i = 0; i < s.length; i++) {\n        c = s[i];\n        if (c > 255) {\n            throw new RangeError();\n        }\n        j = (c ^ (crc >> 8)) & 0xFF;\n        crc = crcTable[j] ^ (crc << 8);\n    }\n    return ((crc ^ 0) & 0xFFFF);\n}\n\nfunction byteStringToByteArray(str) {\n    var splitStr = [];\n    var j = 0;\n    for (let i = 0; i < str.length; i += 2) {\n        splitStr[j] = str.substring(i, i + 2);\n        j++;\n    }\n    var bytes = [];\n    var bytePos = 0;\n    for (let i = 0; i < splitStr.length; i++) {\n        var byteStr = splitStr[i];\n        var b = parseInt(byteStr, 16);\n        if (b < 256) {\n            bytes[bytePos] = b;\n            bytePos++;\n        }\n    }\n    return bytes;\n}\n\nfunction decimalToHex(str) {\n    hexString = str.toString(16);\n    return hexString;\n}\n\nfunction decimalToBinary(x) {\n    let bin = 0;\n    let rem, i = 1,\n        step = 1;\n    while (x !== 0) {\n        rem = x % 2;\n        x = parseInt(x / 2);\n        bin = bin + rem * i;\n        i = i * 10;\n    }\n    return bin;\n}\n\nfunction binaryToHex(x) {\n    var hexa = parseInt(x, 2).toString(16);\n    return hexa;\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":11},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":11191,"Group":{"Id":6207,"Name":"Controls","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Firmware Upgrade","Json":"{\"name\":\"Firmware Upgrade\",\"default\":\"\",\"description\":\"Firmware Upgrade\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Upgrade the device to the latest firmware (if available)\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":5816,"Protocol":{"Id":224,"Code":"Access TEC Roam","Version":"1.7","FirmwareVersion":"V04b.8601.2411.1.0.16.4411.2409.25","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"actionTriggerOTA","TemplateSMS":null,"Template":"<<data>>","AckTemplate":null,"Operation":"// Trigger OTA\r\nvar configs = [];\r\nvar crcTable = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5,\r\n    0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,\r\n    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\r\n    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r\n    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,\r\n    0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\r\n    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b,\r\n    0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r\n    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\r\n    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,\r\n    0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,\r\n    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r\n    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969,\r\n    0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,\r\n    0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\r\n    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r\n    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,\r\n    0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\r\n    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6,\r\n    0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r\n    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\r\n    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,\r\n    0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1,\r\n    0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r\n    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,\r\n    0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,\r\n    0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\r\n    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r\n    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447,\r\n    0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\r\n    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2,\r\n    0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r\n    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\r\n    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,\r\n    0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,\r\n    0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r\n    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,\r\n    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,\r\n    0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\r\n    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r\n    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba,\r\n    0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\r\n    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\r\n];\r\n//create value for URL  40.91.195.192:8098\r\n// http://fota.loctube.com:10007/fi_ota  (Eview server)\r\n// http://40.91.195.192:8098/api/fi_ota  (test server)\r\n// production server 'http://13.81.174.129:8098/api/fi_ota';\r\nif (params.CommunicationSettings.Server === '52.232.85.255,5678') {\r\n    var value = 'http://13.81.174.129:8098/api/fi_ota'; // production OTA server\r\n} else {\r\n    var value = 'http://40.91.195.192:8098/api/fi_ota'; // test OTA server\r\n}\r\nvar value = ascii_to_hexa(value).toUpperCase();\r\nvar sequenceID = (+new Date()).toString(16).slice(-4).toUpperCase();\r\n// control command\r\nvar command = '04';\r\nvar keyLength = ('00' + decimalToHex(1 + (value.length / 2))).slice(-2).toUpperCase();\r\nvar key = '30';\r\nvar messageBody = command + keyLength + key + value;\r\nvar checksum = byteStringToByteArray(messageBody);\r\nchecksum = crc16byte(checksum);\r\nchecksum = decimalToHex(checksum);\r\nchecksum = ('0000' + checksum).slice(-4).toUpperCase();\r\nchecksum = changeEndianness(checksum);\r\nvar totalLenght = ('0000' + decimalToHex(messageBody.length / 2)).slice(-4).toUpperCase();\r\ntotalLenght = changeEndianness(totalLenght);\r\nvar prefix = 'AB10' + totalLenght + checksum + sequenceID;\r\nvar data = prefix + messageBody;\r\nAddValue('data', data);\r\nAddValue('sequenceNumber', sequenceID);\r\nvar commandConfigs = {\r\n    template: \"main\",\r\n    configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n    var cvpair = {\r\n        code: p1,\r\n        value: p2\r\n    };\r\n    configs.push(cvpair);\r\n}\r\n\r\nfunction ascii_to_hexa(str) {\r\n    var arr1 = [];\r\n    for (var n = 0, l = str.length; n < l; n++) {\r\n        var hex = Number(str.charCodeAt(n)).toString(16);\r\n        arr1.push(hex);\r\n    }\r\n    return arr1.join('');\r\n}\r\n\r\nfunction crc16byte(s) {\r\n    var crc = 0x0000;\r\n    var j, i;\r\n    for (i = 0; i < s.length; i++) {\r\n        c = s[i];\r\n        if (c > 255) {\r\n            throw new RangeError();\r\n        }\r\n        j = (c ^ (crc >> 8)) & 0xFF;\r\n        crc = crcTable[j] ^ (crc << 8);\r\n    }\r\n    return ((crc ^ 0) & 0xFFFF);\r\n}\r\n\r\nfunction byteStringToByteArray(str) {\r\n    var splitStr = [];\r\n    var j = 0;\r\n    for (let i = 0; i < str.length; i += 2) {\r\n        splitStr[j] = str.substring(i, i + 2);\r\n        j++;\r\n    }\r\n    var bytes = [];\r\n    var bytePos = 0;\r\n    for (let i = 0; i < splitStr.length; i++) {\r\n        var byteStr = splitStr[i];\r\n        var b = parseInt(byteStr, 16);\r\n        if (b < 256) {\r\n            bytes[bytePos] = b;\r\n            bytePos++;\r\n        }\r\n    }\r\n    return bytes;\r\n}\r\n\r\nfunction decimalToHex(str) {\r\n    hexString = str.toString(16);\r\n    return hexString;\r\n}\r\n\r\nfunction decimalToBinary(x) {\r\n    let bin = 0;\r\n    let rem, i = 1,\r\n        step = 1;\r\n    while (x !== 0) {\r\n        rem = x % 2;\r\n        x = parseInt(x / 2);\r\n        bin = bin + rem * i;\r\n        i = i * 10;\r\n    }\r\n    return bin;\r\n}\r\n\r\nfunction binaryToHex(x) {\r\n    var hexa = parseInt(x, 2).toString(16);\r\n    return hexa;\r\n}\r\n\r\nfunction changeEndianness(string) {\r\n    const result = [];\r\n    let len = string.length - 2;\r\n    while (len >= 0) {\r\n        result.push(string.substr(len, 2));\r\n        len -= 2;\r\n    }\r\n    return result.join('');\r\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":2,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12456,"Group":{"Id":6216,"Name":"Read State","Json":{"description":null,"columns":1,"order":6,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Current Firmware Version Long","Json":"{\"name\":\"Current Firmware Version Long\",\"default\":\"\",\"description\":\"FW Version (Firmware)\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Low‑level firmware containing MCU drivers, GNSS chipset firmware, modem stack, bootloader, and hardware abstraction layers. This version changes less often and determines hardware capabilities.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12456,\"Group\":{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Current Firmware Version Long\",\"Json\":\"{\\\"name\\\":\\\"Current Firmware Version Long\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FW Version (Firmware)\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Low‑level firmware containing MCU drivers, GNSS chipset firmware, modem stack, bootloader, and hardware abstraction layers. This version changes less often and determines hardware capabilities.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1790530804},{"Type":1,"NewValue":"{\"Id\":12456,\"Group\":{\"Id\":6216,\"Name\":\"Read State\",\"Json\":{\"description\":null,\"columns\":1,\"order\":6,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Current Firmware Version Long\",\"Json\":\"{\\\"name\\\":\\\"Current Firmware Version Long\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FW Version (Firmware)\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Low‑level firmware containing MCU drivers, GNSS chipset firmware, modem stack, bootloader, and hardware abstraction layers. This version changes less often and determines hardware capabilities.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":1}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1790530817}],"LanguageId":null,"Tags":[]}],"ProtocolChanges":[{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings2","Message":"(Update) (getCurrentSettings2) set parent command","Timestamp":1733390363},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings3","Message":"(Update) (getCurrentSettings3) set parent command","Timestamp":1733390414},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings4","Message":"(Update) (getCurrentSettings4) set parent command","Timestamp":1733390446},{"Version":"0.2","UserName":"juanmi","Resource":"Command","Name":"getCurrentSettings5","Message":"(Update) (getCurrentSettings5) set parent command","Timestamp":1733390475},{"Version":"0.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"set parent command to enable protocol import","Timestamp":1733390564},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionRealTimeLocation","Message":"(Update) (actionRealTimeLocation) Changed to Forced by SMS","Timestamp":1733954911},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionPowerOff","Message":"(Update) (actionPowerOff) changed to Forced by SMS","Timestamp":1733955031},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) changed to Forced by SMS","Timestamp":1733955479},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"setGateway","Message":"(Update) (setGateway) changed to Forced by SMS","Timestamp":1733955599},{"Version":"0.3","UserName":"juanmi","Resource":"Command","Name":"actionDeviceReboot","Message":"(Update) (actionDeviceReboot) change to Forced by SMS","Timestamp":1734006832},{"Version":"0.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Change some commands to Forced by SMS","Timestamp":1734021010},{"Version":"0.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Pack again to test if import work","Timestamp":1734266064},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Fix Read Enable Disable Speed Dial Settings","Timestamp":1734423608},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) fix read speed dial","Timestamp":1734424064},{"Version":"0.5","UserName":"juanmi","Resource":"Command","Name":"actionConfigurationMode","Message":"(Update) (actionConfigurationMode) When Config Mode is off, set HB to 240s.","Timestamp":1734458640},{"Version":"0.5","UserName":"juanmi","Resource":"Command","Name":"setPerformanceMode","Message":"(Update) (setPerformanceMode) Check params.Controls.ConfigurationMode on or off to set HB","Timestamp":1734459146},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Get EnableDisableReadSpeedDialSettings (USER STORY 1485836)","Timestamp":1734461682},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Fix Get Status Speed Dial (\nUSER STORY 1485836)","Timestamp":1734462462},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) continue last fix","Timestamp":1734463709},{"Version":"0.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Remove prefix Ax in get Approved Numbers List (USER STORY 1485836)","Timestamp":1734463932},{"Version":"0.5","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"small fixes during Smoke Test. ConfigMode back to 240s, Get Speed Dial Status and Approved contacts list.","Timestamp":1734464663},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) modify case '21': // Speed Dial Settings","Timestamp":1734520814},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Fix get key=2 case '21': // Speed Dial Settings","Timestamp":1734521810},{"Version":"0.6","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Removed labels in Read Wifi and Beacons.","Timestamp":1734522292},{"Version":"0.6","UserName":"juanmi","Resource":"GroupParam","Name":"No Activity","Message":"(Update) (No Activity) Add noActivityInterval","Timestamp":1734525297},{"Version":"0.6","UserName":"Michael_Admin","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) \tineedtoresetEV04!","Timestamp":1734595853},{"Version":"0.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Small fixes for version 1.0 - SMS reset, get Speed dial settings, etc.","Timestamp":1734605686},{"Version":"0.7","UserName":"juanmi","Resource":"Command","Name":"setGateway","Message":"(Update) (setGateway) Assign gateway_number for SMS","Timestamp":1734622575},{"Version":"0.7","UserName":"juanmi","Resource":"Command","Name":"setGateway","Message":"(Update) (setGateway)  doesn't accept SMS+ Untogle Call in SMS msg","Timestamp":1734632777},{"Version":"0.7","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"SetGateWat command : doesn't accept SMS+ Untogle Call in SMS msg","Timestamp":1736339136},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Enable Disable No Activity","Message":"(Update) (Enable Disable No Activity) add tag ActivateNoActivity","Timestamp":1736339464},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read WiFi List","Message":"(Update) (Read WiFi List) delete description","Timestamp":1736340151},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Fall Settings","Message":"(Update) (Read Fall Settings) delete description","Timestamp":1736340245},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Non Movement Settings","Message":"(Update) (Read Non Movement Settings) delete description","Timestamp":1736340275},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read System Settings","Message":"(Update) (Read System Settings) delete description","Timestamp":1736340297},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"WiFi List","Message":"(Update) (WiFi List) delete description","Timestamp":1736340361},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Approved Contacts","Message":"(Update) (Approved Contacts) delete description","Timestamp":1736340390},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"No Activity","Message":"(Update) (No Activity) delete description","Timestamp":1736340470},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"System Settings","Message":"(Update) (System Settings) delete description","Timestamp":1736340526},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Additional Settings","Message":"(Update) (Read Additional Settings) Reorder Groups","Timestamp":1736425387},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Performance Settings","Message":"(Update) (Read Performance Settings) Reorder Groups","Timestamp":1736425391},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Alert Settings","Message":"(Update) (Read Alert Settings) Reorder Groups","Timestamp":1736425512},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Performance Settings","Message":"(Update) (Read Performance Settings) Reorder Groups","Timestamp":1736425516},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Alert Settings","Message":"(Update) (Read Alert Settings) Reorder Groups","Timestamp":1736427634},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Additional Settings","Message":"(Update) (Read Additional Settings) Reorder Groups","Timestamp":1736427637},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Performance Settings","Message":"(Update) (Read Performance Settings) Reorder Groups","Timestamp":1736427677},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Alert Settings","Message":"(Update) (Read Alert Settings) Reorder Groups","Timestamp":1736427684},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Additional Settings","Message":"(Update) (Read Additional Settings) Reorder Groups","Timestamp":1736427688},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Alert Settings","Message":"(Update) (Alert Settings) Reorder Groups","Timestamp":1736427728},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Performance Settings","Message":"(Update) (Performance Settings) Reorder Groups","Timestamp":1736427733},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Additional Settings","Message":"(Update) (Additional Settings) Reorder Groups","Timestamp":1736427737},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"System Settings","Message":"(Update) (System Settings) Reorder Groups","Timestamp":1736427742},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Alert Settings","Message":"(Update) (Read Alert Settings) Reorder Groups","Timestamp":1736427923},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Performance Settings","Message":"(Update) (Read Performance Settings) Reorder Groups","Timestamp":1736427926},{"Version":"0.8","UserName":"juanmi","Resource":"Group","Name":"Read Performance Settings","Message":"(Update) (Read Performance Settings) reorder","Timestamp":1736427938},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"WiFi List","Message":"(Update) (WiFi List) add help text","Timestamp":1736448357},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Speed Dial Number","Message":"(Update) (Speed Dial Number) add help text","Timestamp":1736448507},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Allow List","Message":"(Update) (Allow List) add help text","Timestamp":1736448669},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Auto Answer","Message":"(Update) (Auto Answer) add help text","Timestamp":1736448712},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Volume","Message":"(Update) (Volume) add help text","Timestamp":1736448746},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"APN","Message":"(Update) (APN) add help text","Timestamp":1736448942},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Server","Message":"(Update) (Server) add help text","Timestamp":1736449011},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"SMS Gateway","Message":"(Update) (SMS Gateway) add help text","Timestamp":1736449062},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"SSID","Message":"(Update) (SSID) add help text","Timestamp":1736449397},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Password","Message":"(Update) (Password) add help text","Timestamp":1736449434},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Speed Dial Number","Message":"(Update) (Speed Dial Number) add help text","Timestamp":1736449551},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Contact","Message":"(Update) (Contact) add help text","Timestamp":1736449634},{"Version":"0.8","UserName":"juanmi","Resource":"GroupParam","Name":"Beacon","Message":"(Update) (Beacon) add help text","Timestamp":1736449672},{"Version":"0.8","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"UI improvements: delete descriptions, reorder groups, add help texts","Timestamp":1736449827},{"Version":"0.9","UserName":"Michael_Admin","Resource":"GroupParam","Name":"SSID","Message":"(Update) (SSID) Reorder Group Params","Timestamp":1736530779},{"Version":"0.9","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Password","Message":"(Update) (Password) Reorder Group Params","Timestamp":1736530782},{"Version":"0.9","UserName":"Michael_Admin","Resource":"Group","Name":"WiFi List","Message":"(Update) (WiFi List) reorder the wifi ssid and password ","Timestamp":1736530831},{"Version":"0.9","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"reorder wifi and others","Timestamp":1737368019},{"Version":"1.0","UserName":"juanmi","Resource":"GroupParam","Name":"Server","Message":"(Update) (Server) Add Protocol-dev to servers list","Timestamp":1742495687},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Review and update the Read method For Beacons/Wifi/Whitelist - Ticket 1569531","Timestamp":1742549373},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Review and update the Read method For Whitelist","Timestamp":1742550263},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Optimize Auxiliary functions and fix sendDataToReceiver","Timestamp":1742635144},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Fix sendMessageToLocalhostNoWait (local port)","Timestamp":1742645392},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) fix sendMessageToLocalhostNoWait 2","Timestamp":1742648212},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) fix sendMessageToLocalhostNoWait 3","Timestamp":1742648816},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) sendMessageToLocalhostNoWait port to acceptance server","Timestamp":1742649832},{"Version":"1.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) typo error","Timestamp":1742649962},{"Version":"1.0","UserName":"Sean-Admin","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) remove console.log in decoder case '03'","Timestamp":1744112746},{"Version":"1.0","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"DEV BUG 1634606 - remove console.log in decoder case '03'","Timestamp":1744134433},{"Version":"1.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Return from function when no Imei in server param to create the long connection. sendMessageToLocalhostNoWait(\"Eview-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\");","Timestamp":1744278584},{"Version":"1.1","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix tickets regarding bugs with long connection","Timestamp":1744282947},{"Version":"1.2","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Comment \"return\" in msg ASSOCIATE in msg types !=03  ","Timestamp":1744367131},{"Version":"1.2","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Fix issue with long connection stablishment","Timestamp":1744367491},{"Version":"1.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Change Eview for Roam in HTB","Timestamp":1744388039},{"Version":"1.3","UserName":"juanmi","Resource":"MessageType","Name":"CHK","Message":"(Update) (CHK) change Eview for Roam","Timestamp":1744388113},{"Version":"1.3","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Fix ticket 1644380 - Bug  .reverse  of null","Timestamp":1744733497},{"Version":"1.3","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":" Bug .reverse of null ","Timestamp":1744734267},{"Version":"1.4","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) add Protocol-dev server in getConfigs","Timestamp":1748383508},{"Version":"1.4","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) create long connection it it is needed for command 01 and 03","Timestamp":1749056431},{"Version":"1.4","UserName":"juanmi","Resource":"MessageType","Name":"CON-ASSO","Message":"(Update) (CON-ASSO) change msg code to CON","Timestamp":1749056501},{"Version":"1.4","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) comment //return to create long connection","Timestamp":1749108615},{"Version":"1.4","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Message gets parsed by Watch/Sentry","Timestamp":1749580812},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"ALA-F","Message":"(Create) (ALA-F) create ALA-F for alarm finished","Timestamp":1757760305},{"Version":"1.5","UserName":"juanmi","Resource":"MessageType","Name":"ALA-F","Message":"(Update) (ALA-F) do not send commands","Timestamp":1757760355},{"Version":"1.5","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Ticket 1822799: AGPS bug location time and 1823723: Split msg and 1796516: Include location in alarm msg","Timestamp":1757762557},{"Version":"1.5","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"mdc to do full regression on acceptance ","Timestamp":1758036250},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Create) (Convert Rio to Roam) Create checkbox: Convert Rio to Roam","Timestamp":1760465131},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setContinuousLocate","Timestamp":1760465135},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setEmergencySettings","Timestamp":1760465137},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setEnableControl","Timestamp":1760465140},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setGateway","Timestamp":1760465142},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setPerformanceMode","Timestamp":1760465145},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setServer","Timestamp":1760465147},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setSOSOption","Timestamp":1760465150},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setSystemSettings","Timestamp":1760465152},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setVoicePrompt","Timestamp":1760465155},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Reorder Group Params","Timestamp":1760465192},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Configuration Mode","Message":"(Update) (Configuration Mode) Reorder Group Params","Timestamp":1760465195},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Get Current Config","Message":"(Update) (Get Current Config) Reorder Group Params","Timestamp":1760465197},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Clear Buffered Messages","Message":"(Update) (Clear Buffered Messages) Reorder Group Params","Timestamp":1760465200},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Real Time Locate","Message":"(Update) (Real Time Locate) Reorder Group Params","Timestamp":1760465202},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) move control","Timestamp":1760465248},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Unhide control","Timestamp":1760465290},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Configuration Mode","Message":"(Update) (Configuration Mode) Reorder Group Params","Timestamp":1760465337},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Reorder Group Params","Timestamp":1760465339},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Add description","Timestamp":1760465385},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) add setCustomID","Timestamp":1760465832},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setCustom ID","Timestamp":1760465836},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionDeleteRecords","Message":"(Update) (actionDeleteRecords) delete Order property","Timestamp":1760465888},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionDeviceReboot","Message":"(Update) (actionDeviceReboot) delete Order property","Timestamp":1760465905},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionFactoryReset","Message":"(Update) (actionFactoryReset) delete Order property","Timestamp":1760465925},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionFindDevice","Message":"(Update) (actionFindDevice) delete Order property","Timestamp":1760465939},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionPowerOff","Message":"(Update) (actionPowerOff) delete Order property","Timestamp":1760465956},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionRealTimeLocation","Message":"(Update) (actionRealTimeLocation) delete Order property","Timestamp":1760465971},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"actionTrace","Message":"(Update) (actionTrace) delete Order property","Timestamp":1760465992},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getCustomId","Message":"(Update) (getCustomId) delete Order property","Timestamp":1760466093},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getFallDownAlert","Message":"(Update) (getFallDownAlert) delete Order property","Timestamp":1760466112},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getFirmwareVersion","Message":"(Update) (getFirmwareVersion) delete Order property","Timestamp":1760466128},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getNoMotionAlert","Message":"(Update) (getNoMotionAlert) delete Order property","Timestamp":1760466148},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getPerformanceMode","Message":"(Update) (getPerformanceMode) delete Order property","Timestamp":1760466165},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getSystemLanguage","Message":"(Update) (getSystemLanguage) delete Order property","Timestamp":1760466184},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"getVolume","Message":"(Update) (getVolume) delete Order property","Timestamp":1760466203},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setAuthorisedNumbers","Message":"(Update) (setAuthorisedNumbers) delete Order property","Timestamp":1760466269},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setContinuousLocate","Message":"(Update) (setContinuousLocate) set Order property","Timestamp":1760466367},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setCustom ID","Message":"(Update) (setCustom ID) set Order property","Timestamp":1760466515},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setContinuousLocate","Message":"(Update) (setContinuousLocate) set default values","Timestamp":1760466803},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setEmergencySettings","Message":"(Update) (setEmergencySettings) set Order property","Timestamp":1760466935},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setEnableControl","Message":"(Update) (setEnableControl) set order and default values for Roam","Timestamp":1760467518},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setFallSettings","Message":"(Update) (setFallSettings) Delete Order property","Timestamp":1760467584},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setHomeBeacon","Message":"(Update) (setHomeBeacon) Delete Order property","Timestamp":1760467638},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setPerformanceMode","Message":"(Update) (setPerformanceMode) set Order property","Timestamp":1760467724},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setSOSOption","Message":"(Update) (setSOSOption) set Order property and default values","Timestamp":1760468014},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings) set Order property and default values for Roam","Timestamp":1760468301},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setVoicePromptExtra","Message":"(Create) (setVoicePromptExtra) set Order and default values","Timestamp":1760468897},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Reorder Group Params","Timestamp":1760526068},{"Version":"1.6","UserName":"juanmi","Resource":"Group","Name":"Controls","Message":"(Update) (Controls) move convert rio to roam","Timestamp":1760526087},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Enable setVoicePromptExtra, disable setVoicePrompt","Timestamp":1760527185},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setVoicePromptExtra","Timestamp":1760527189},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Dissociate groupParam Convert Rio to Roam from command setVoicePrompt","Timestamp":1760527192},{"Version":"1.6","UserName":"juanmi","Resource":"Command","Name":"setGateway","Message":"(Update) (setGateway) change ForceSMS with Default (GPRS)","Timestamp":1760600454},{"Version":"1.6","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) hide checkbox","Timestamp":1760602509},{"Version":"1.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 1708400: Convert Rio device to Roam","Timestamp":1760603701},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) unhide convert to roam control","Timestamp":1761240479},{"Version":"1.7","UserName":"Michael_Admin","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Added firmware reminder into help text ","Timestamp":1761662730},{"Version":"1.7","UserName":"juanmi","Resource":"Command","Name":"setAPN","Message":"(Update) (setAPN) set order to 1 (second msg)","Timestamp":1761679005},{"Version":"1.7","UserName":"juanmi","Resource":"Command","Name":"setServer","Message":"(Update) (setServer) set order 0 (first msg to send)","Timestamp":1761679057},{"Version":"1.7","UserName":"juanmi","Resource":"Command","Name":"setPowerAlert","Message":"(Update) (setPowerAlert) modify to set default values in conversion script and set order to 11","Timestamp":1761679102},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) add setPowerAlert to conversion to Roam","Timestamp":1761679443},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"Associate groupParam Convert Rio to Roam to command setPowerAlert","Timestamp":1761679447},{"Version":"1.7","UserName":"juanmi","Resource":"Command","Name":"actionTriggerOTA","Message":"(Create) (actionTriggerOTA) Create command setTriggerOTA","Timestamp":1761682722},{"Version":"1.7","UserName":"juanmi","Resource":"Command","Name":"actionTriggerOTA","Message":"(Update) (actionTriggerOTA) modify to set param value","Timestamp":1761683092},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"(Update) (Firmware Upgrade) assign command to OTA button","Timestamp":1761683436},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"Associate groupParam Firmware Upgrade to command actionTriggerOTA","Timestamp":1761683439},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Convert Rio to Roam","Message":"(Update) (Convert Rio to Roam) Reorder Group Params","Timestamp":1761815782},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Firmware Upgrade","Message":"(Update) (Firmware Upgrade) Reorder Group Params","Timestamp":1761815784},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Power Off","Message":"(Update) (Power Off) Reorder Group Params","Timestamp":1761815787},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Reboot","Message":"(Update) (Reboot) Reorder Group Params","Timestamp":1761815789},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Factory Defaults","Message":"(Update) (Factory Defaults) change name and help text","Timestamp":1761816026},{"Version":"1.7","UserName":"juanmi","Resource":"GroupParam","Name":"Factory Defaults","Message":"(Update) (Factory Defaults) Reorder Group Params","Timestamp":1761816069},{"Version":"1.7","UserName":"juanmi","Resource":"Group","Name":"Controls","Message":"(Update) (Controls) reorder.. move Factory Defaults","Timestamp":1761816097},{"Version":"1.7","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Added actionTriggerOTA and Conversion Rio to SEntry (Factory defaults)","Timestamp":1761816441},{"Version":"1.8","UserName":"juanmi","Resource":"GroupParam","Name":"Factory Defaults","Message":"(Delete) (Factory Defaults)","Timestamp":1771525837},{"Version":"1.8","UserName":"juanmi","Resource":"Command","Name":"setSystemSettings","Message":"(Update) (setSystemSettings) ticket 2089628: FIX setsettings not working ","Timestamp":1771526487},{"Version":"1.8","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 2089628: setsettings not working on Sentry P1 and Roam P2","Timestamp":1771529113},{"Version":"1.9","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Ticket 2014202: Make internal sender function more resilient","Timestamp":1774209455},{"Version":"1.9","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"Ticket 2014202: Make internal sender function more resilient","Timestamp":1774384688},{"Version":"2.0","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Create) (F-ACK-Battery Power Low) create local code low battery ACK","Timestamp":1775042165},{"Version":"2.0","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Not Registered","Message":"(Create) (F-ACK-Not Registered) define ACK fails","Timestamp":1775042310},{"Version":"2.0","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Out Of Service","Message":"(Create) (F-ACK-Out Of Service) define ACK fails","Timestamp":1775042357},{"Version":"2.0","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) change eview to roam","Timestamp":1775042380},{"Version":"2.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam)  ticket 2014202: avoid console.log","Timestamp":1775042492},{"Version":"2.0","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"tickets 2014202:internal sender and 2080422: OTA show battery low alarm","Timestamp":1775042518},{"Version":"2.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) tickets 2076011, 2076012, 2076010 and add debug function in several lines","Timestamp":1775726185},{"Version":"2.1","UserName":"juanmi","Resource":"GroupParam","Name":"SystemLanguage","Message":"(Update) (SystemLanguage) Define labels and reorder languages options","Timestamp":1776189439},{"Version":"2.1","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) ticket 2209515: Read language label","Timestamp":1776191067},{"Version":"2.1","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 2209515: languages tickets 2076011, 2076012, 2076010: Accesory protocol","Timestamp":1776363118},{"Version":"2.2","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) Ticket 2076011: check when battery > 100","Timestamp":1777307253},{"Version":"2.2","UserName":"Test-Admin","Resource":"Protocol","Name":null,"Message":"Fake new version to fix protocol-import","Timestamp":1777620861},{"Version":"2.3","UserName":"Test-Admin","Resource":"Protocol","Name":null,"Message":"Another fake version","Timestamp":1777621088},{"Version":"2.4","UserName":"Test-Admin","Resource":"Protocol","Name":null,"Message":"Fake version for local debug","Timestamp":1777621575},{"Version":"2.5","UserName":"Test-Admin","Resource":"Protocol","Name":null,"Message":"One more fake version","Timestamp":1777638492},{"Version":"2.6","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) ticket 2080422: change msg code to raise event Battery LOW to do OTA","Timestamp":1778535461},{"Version":"2.6","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) set to alarm","Timestamp":1778536044},{"Version":"2.6","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"ticket 2080422: change msg code to raise event Battery LOW to do OTA","Timestamp":1778924190},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) change to ACK","Timestamp":1780680224},{"Version":"2.7","UserName":"juanmi","Resource":"MessageType","Name":"OBTL","Message":"(Create) (OBTL) to show OTA battery low in event widget","Timestamp":1780680320},{"Version":"2.7","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) to parse oysta template for OTA low battery warning","Timestamp":1780680404},{"Version":"2.7","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"User Story 2361805: EVIEW OTA Low Battery TEST","Timestamp":1780909807},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-APN","Message":"(Update) (ACK-APN) change from Long connection to do not send command","Timestamp":1781796735},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-BEAC-SMS","Message":"(Update) (ACK-BEAC-SMS) change from Long connection to do not send command","Timestamp":1781796744},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-CONTAC-SMS","Message":"(Update) (ACK-CONTAC-SMS) change from Long connection to do not send command","Timestamp":1781796756},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-CUSTID","Message":"(Update) (ACK-CUSTID) change from Long connection to do not send command","Timestamp":1781796767},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-EPHONE","Message":"(Update) (ACK-EPHONE) change from Long connection to do not send command","Timestamp":1781796791},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FALLALERT","Message":"(Update) (ACK-FALLALERT) change from Long connection to do not send command","Timestamp":1781796812},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FALLSENS","Message":"(Update) (ACK-FALLSENS) change from Long connection to do not send command","Timestamp":1781796821},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FALLSENS-SMS","Message":"(Update) (ACK-FALLSENS-SMS) change from Long connection to do not send command","Timestamp":1781796837},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FIRM","Message":"(Update) (ACK-FIRM) change from Long connection to do not send command","Timestamp":1781796861},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FIRM-SMS","Message":"(Update) (ACK-FIRM-SMS) change from Long connection to do not send command","Timestamp":1781796883},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-FLU","Message":"(Update) (ACK-FLU) change from Long connection to do not send command","Timestamp":1781796898},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-GAPN","Message":"(Update) (ACK-GAPN) change from Long connection to do not send command","Timestamp":1781796909},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-GDATA","Message":"(Update) (ACK-GDATA) change from Long connection to do not send command","Timestamp":1781796921},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-GSRV","Message":"(Update) (ACK-GSRV) change from Long connection to do not send command","Timestamp":1781796930},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-GTW","Message":"(Update) (ACK-GTW) change from Long connection to do not send command","Timestamp":1781796940},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-HB-SMS","Message":"(Update) (ACK-HB-SMS) change from Long connection to do not send command","Timestamp":1781796950},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-LANG","Message":"(Update) (ACK-LANG) change from Long connection to do not send command","Timestamp":1781796960},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-MODE","Message":"(Update) (ACK-MODE) change from Long connection to do not send command","Timestamp":1781796970},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-NOMOTION","Message":"(Update) (ACK-NOMOTION) change from Long connection to do not send command","Timestamp":1781796979},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-OFF","Message":"(Update) (ACK-OFF) change from Long connection to do not send command","Timestamp":1781796990},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-PREFIX","Message":"(Update) (ACK-PREFIX) change from Long connection to do not send command","Timestamp":1781797013},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-RBT","Message":"(Update) (ACK-RBT) change from Long connection to do not send command","Timestamp":1781797034},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-RST","Message":"(Update) (ACK-RST) change from Long connection to do not send command","Timestamp":1781797052},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-RTL","Message":"(Update) (ACK-RTL) change from Long connection to do not send command","Timestamp":1781797060},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-SERV-SMS","Message":"(Update) (ACK-SERV-SMS) change from Long connection to do not send command","Timestamp":1781797072},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-SRV","Message":"(Update) (ACK-SRV) change from Long connection to do not send command","Timestamp":1781797089},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-TRACE","Message":"(Update) (ACK-TRACE) change from Long connection to do not send command","Timestamp":1781797105},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"ACK-VOL","Message":"(Update) (ACK-VOL) change from Long connection to do not send command","Timestamp":1781797142},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"F-ACK-Battery Power Low","Message":"(Update) (F-ACK-Battery Power Low) is fail ack","Timestamp":1781797353},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"HRT","Message":"(Update) (HRT) fix ticket 1819052","Timestamp":1781797536},{"Version":"2.8","UserName":"juanmi","Resource":"MessageType","Name":"STP","Message":"(Update) (STP) Fix ticket 1819052","Timestamp":1781797573},{"Version":"2.8","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) 778119: fix: iBeacon location not used when BLE data also  present","Timestamp":1782757627},{"Version":"2.8","UserName":"Michael_Admin","Resource":"Protocol","Name":null,"Message":"pack for testing on P-I","Timestamp":1783525547},{"Version":"2.9","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) 2595957 [PROTOCOL][CAREWATCH] Malformed location data","Timestamp":1789381169},{"Version":"2.9","UserName":"juanmi","Resource":"Protocol","Name":null,"Message":"2595957 [PROTOCOL][CAREWATCH] Malformed location data","Timestamp":1789381184},{"Version":"3.0","UserName":"juanmi","Resource":"Command","Name":"getFirmwareVersionLong","Message":"(Update) (getFirmwareVersionLong) change name, this command only gets Firmware version long","Timestamp":1790530512},{"Version":"3.0","UserName":"juanmi","Resource":"Command","Name":"getFirmwareVersion","Message":"(Create) (getFirmwareVersion) new command to get both version of firmware and software","Timestamp":1790530662},{"Version":"3.0","UserName":"juanmi","Resource":"GroupParam","Name":"Current Firmware Version","Message":"(Update) (Current Firmware Version) change description and help text","Timestamp":1790530734},{"Version":"3.0","UserName":"juanmi","Resource":"GroupParam","Name":"Current Firmware Version Long","Message":"(Create) (Current Firmware Version Long) new param for long FW version","Timestamp":1790530804},{"Version":"3.0","UserName":"juanmi","Resource":"GroupParam","Name":"Current Firmware Version","Message":"(Update) (Current Firmware Version) Reorder Group Params","Timestamp":1790530815},{"Version":"3.0","UserName":"juanmi","Resource":"GroupParam","Name":"Current Firmware Version Long","Message":"(Update) (Current Firmware Version Long) Reorder Group Params","Timestamp":1790530817},{"Version":"3.0","UserName":"juanmi","Resource":"GroupParam","Name":"Custom Id","Message":"(Update) (Custom Id) Reorder Group Params","Timestamp":1790530820},{"Version":"3.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) ticket 2717736. Add “Version” & “FW Version” Fields + Help Text Across All Eview UI Device Families","Timestamp":1790531826},{"Version":"3.0","UserName":"juanmi","Resource":"Operation","Name":"Access TEC Roam","Message":"(Update) (Access TEC Roam) small fix","Timestamp":1790536192}],"ProtocolActionObjects":[],"Tags":[{"Id":2136,"Name":"OneCommandSender","BackendAction":"oneCommandSender","Value":"true"}],"MessageCodes":[{"Name":"Alarm - Movement","Description":"At alert on movement ( not fall)","Code":"ALMOV","CanLiveInsights":false},{"Name":"Alarm-Welfare Check","Description":"Welfare check alarm","Code":"ALW","CanLiveInsights":false},{"Name":"Cycle","Description":"Regular, cyclic, events from a device","Code":"CYC","CanLiveInsights":false},{"Name":"Location - other","Description":"Location - other","Code":"LOCN","CanLiveInsights":false},{"Name":"Acknowledge","Description":"Acknowledgment of a command sent to the device","Code":"ACK","CanLiveInsights":false},{"Name":"Battery Charging - On","Description":"Battery Charging - On","Code":"BATCN","CanLiveInsights":false},{"Name":"Check / keep alive / Heartbeat","Description":"Keep alive / heartbeat signal to maintain a connection ","Code":"CHK","CanLiveInsights":false},{"Name":"Alarm - Amber Alert","Description":"Alarm - Amber Alert","Code":"ALA","CanLiveInsights":false},{"Name":"Alarm – Fall","Description":"Alarm – Fall","Code":"ALF","CanLiveInsights":false},{"Name":"Alarm – Non movement","Description":"Alarm – Non movement","Code":"ALNM","CanLiveInsights":false},{"Name":"Alarm - Smoke","Description":"Alarm - Smoke","Code":"ALSM","CanLiveInsights":false},{"Name":"Alarm - Speed","Description":"Alarm - Speed","Code":"ALSP","CanLiveInsights":false},{"Name":"Alarm – Emergency Cancelled","Description":"Alarm – Emergency Cancelled by the user","Code":"ALSOS-C","CanLiveInsights":false},{"Name":"Battery Charging - off","Description":"Battery Charging - off","Code":"BATCF","CanLiveInsights":false},{"Name":"Battery empty","Description":"Battery empty","Code":"BATE","CanLiveInsights":false},{"Name":"Battery full","Description":"Battery full","Code":"BATF","CanLiveInsights":false},{"Name":"Battery low","Description":"Battery low","Code":"BATL","CanLiveInsights":false},{"Name":"Button Press","Description":"Button Press","Code":"BPRS","CanLiveInsights":false},{"Name":"Ebeacon zone in","Description":"Ebeacon zone in","Code":"EBZI","CanLiveInsights":false},{"Name":"Ebeacon zone out","Description":"Ebeacon zone out","Code":"EBZO","CanLiveInsights":false},{"Name":"Location check in","Description":"Location check in","Code":"LCI","CanLiveInsights":false},{"Name":"Location check out","Description":"Location check out","Code":"LCO","CanLiveInsights":false},{"Name":"Reminder not ok","Description":"Reminder not ok","Code":"MRME","CanLiveInsights":false},{"Name":"No Activity","Description":"No Activity","Code":"NACT","CanLiveInsights":false},{"Name":"Power Off","Description":"Power Off","Code":"PWRF","CanLiveInsights":false},{"Name":"Power On","Description":"Power On","Code":"PWRN","CanLiveInsights":false},{"Name":"Vehicle - Driving hours excess","Description":"Vehicle - Driving hours excess","Code":"VDE","CanLiveInsights":false},{"Name":"Vehicle – Fuel cap","Description":"Vehicle – Fuel cap","Code":"VFC","CanLiveInsights":false},{"Name":"Vehicle - Fuel level","Description":"Vehicle - Fuel level","Code":"VFL","CanLiveInsights":false},{"Name":"Vehicle – Harsh braking","Description":"Vehicle – Harsh braking","Code":"VHB","CanLiveInsights":false},{"Name":"Vehicle – Ignition off","Description":"Vehicle – Ignition off","Code":"VIGF","CanLiveInsights":false},{"Name":"Vehicle – Driver not authorized","Description":"Vehicle – Driver not authorized","Code":"VNA","CanLiveInsights":false},{"Name":"Vehicle – Night driving","Description":"Vehicle – Night driving","Code":"VND","CanLiveInsights":false},{"Name":"Vehicle – Ignition on","Description":"Vehicle – Ignition on","Code":"VIGN","CanLiveInsights":false},{"Name":"Vehicle – Seat belt","Description":"Vehicle – Seat belt","Code":"VSB","CanLiveInsights":false},{"Name":"Zone in","Description":"Zone in","Code":"ZNI","CanLiveInsights":false},{"Name":"Zone out","Description":"Zone out","Code":"ZNO","CanLiveInsights":false},{"Name":"Device Status","Description":"Device Status","Code":"STATUS","CanLiveInsights":false},{"Name":"Real time location ","Description":"Real time location ","Code":"RTL","CanLiveInsights":false},{"Name":"Encoded communication","Description":"Encoded communication","Code":"ENC","CanLiveInsights":false},{"Name":"Proximity","Description":"Proximity alert ","Code":"PROX","CanLiveInsights":false},{"Name":"Dummy - do NOT use ","Description":"Dummy template - should not be used","Code":"DUMMY","CanLiveInsights":false},{"Name":"Battery High","Description":"Battery High","Code":"BATH","CanLiveInsights":false},{"Name":"Location - Set Available","Description":"Location - Set Available","Code":"LSA","CanLiveInsights":false},{"Name":"Location - Set Busy","Description":"Location - Set Busy","Code":"LSB","CanLiveInsights":false},{"Name":"Device information","Description":"General Device Information from the device","Code":"INFO","CanLiveInsights":false},{"Name":"Alarm - Tamper","Description":"Alarm - Device Tamper","Code":"ALTAM","CanLiveInsights":false},{"Name":"Communication ","Description":"General communication, initialisation etc.","Code":"COMM","CanLiveInsights":false},{"Name":"Humidity","Description":"Relative humidity","Code":"RH","CanLiveInsights":false},{"Name":"Temperature","Description":"Temperature","Code":"TEMP","CanLiveInsights":false},{"Name":"Alarm - Temperature","Description":"Alarm - Temperature","Code":"ALTEMP","CanLiveInsights":false},{"Name":"Alarm - Humidity","Description":"Alarm - Relative Humidity","Code":"ALRH","CanLiveInsights":false},{"Name":"Proximity End","Description":"Proximity End","Code":"PROX-E","CanLiveInsights":false},{"Name":"Alarm - PIR","Description":"Alarm - PIR","Code":"ALPIR","CanLiveInsights":false},{"Name":"PIR - Movements","Description":"Number of PIR movements detected in reporting period","Code":"PIRM","CanLiveInsights":false},{"Name":"Battery Report","Description":"Battery Voltage Report","Code":"BATR","CanLiveInsights":false},{"Name":"Alarm - Sim Swap","Description":"Alarm - Sim Swap","Code":"ALSS","CanLiveInsights":false},{"Name":"Mileage","Description":"Mileage","Code":"MIL","CanLiveInsights":false},{"Name":"Intrusion","Description":"Intrusion","Code":"INT","CanLiveInsights":false},{"Name":"No Fix Report","Description":"No fix report","Code":"NFR","CanLiveInsights":false},{"Name":"Switched Off Report","Description":"Switched off report","Code":"SOR","CanLiveInsights":false},{"Name":"End - Shift","Description":"End - Shift","Code":"ENDSH","CanLiveInsights":false},{"Name":"Sleep Mode","Description":"Device comes to sleep mode","Code":"SPM","CanLiveInsights":false},{"Name":"Wake Up Device","Description":"Device Wake Up from SleepMode","Code":"WUD","CanLiveInsights":false},{"Name":"Door Closed","Description":"Door Closed","Code":"DRCL","CanLiveInsights":false},{"Name":"Door Open","Description":"Door Open","Code":"DRO","CanLiveInsights":false},{"Name":"Alarm Door Closed","Description":"Alarm Door Closed","Code":"ALDC","CanLiveInsights":false},{"Name":"Alarm Door Open","Description":"Alarm Door Open","Code":"ALDO","CanLiveInsights":false},{"Name":"Alarm - Amber Alert - Snooze","Description":"Amber Alert Alarm - snoozed by user","Code":"ALA-S","CanLiveInsights":false},{"Name":"Amber Alert - On","Description":"Amber Alert Alarm created by User","Code":"ALA-O","CanLiveInsights":false},{"Name":"Reminder OK","Description":"Reminder OK","Code":"MRMK","CanLiveInsights":false},{"Name":"Message - text","Description":"Message-  text","Code":"MSG","CanLiveInsights":false},{"Name":"Start - Shift","Description":"Start- Shift","Code":"STSH","CanLiveInsights":false},{"Name":"Beacon","Description":"Beacon","Code":"BT","CanLiveInsights":false},{"Name":"Alarm - Amber Alert - Cancel","Description":"Amber alert alarm, cancelled by user","Code":"ALA-C","CanLiveInsights":false},{"Name":"Alarm-Impact","Description":"Alarm-Impact","Code":"ALI","CanLiveInsights":false},{"Name":"Reminder Snooze ","Description":"Reminder - snooze","Code":"MRM-S","CanLiveInsights":false},{"Name":"Blood Pressure","Description":"Blood Pressure","Code":"HBP","CanLiveInsights":false},{"Name":"Heart Rate","Description":"Heart Rate","Code":"HRT","CanLiveInsights":false},{"Name":"SELFTEST","Description":"Used for Testing Purposes","Code":"TEST","CanLiveInsights":false},{"Name":"Alarm - Fall Cancelled","Description":"Alarm -  Fall Cancelled","Code":"ALF-C","CanLiveInsights":false},{"Name":"Alarm – Non Movement Cancelled","Description":"Alarm – Non movement Cancelled by the user","Code":"ALNM-C","CanLiveInsights":false},{"Name":"Insight","Description":"Insight","Code":"INSIGHT","CanLiveInsights":false},{"Name":"Quantity Drunk","Description":"Quantity of liquid drunk ","Code":"QDRNK","CanLiveInsights":false},{"Name":"Bed - in","Description":"Bed or seat sensor ","Code":"BEDIN","CanLiveInsights":false},{"Name":"Bed - Out","Description":"Bed / seat sensor","Code":"BEDOUT","CanLiveInsights":false},{"Name":"Leak sensor","Description":"Leak detected ","Code":"LEAK","CanLiveInsights":false},{"Name":"Light - Lux","Description":"Light levels - LUX ","Code":"LUX","CanLiveInsights":false},{"Name":"Exited","Description":"Exited","Code":"EXIT","CanLiveInsights":false},{"Name":"Entered","Description":"Entered","Code":"ENTER","CanLiveInsights":false},{"Name":"Answered Door","Description":"Answered Door","Code":"ANSWDR","CanLiveInsights":false},{"Name":"Alarm – Emergency","Description":"Alarm – Emergency","Code":"ALSOS","CanLiveInsights":true},{"Name":"Alarm – Gas","Description":"Alarm – Gas ( carbon monixide, carbon dioxide, propane, butane ) ","Code":"ALG","CanLiveInsights":false},{"Name":"Leak Off","Description":"Leak detection has stopped alerting","Code":"LEAK-OFF","CanLiveInsights":false},{"Name":"Question-Answer","Description":"Question - Answer response","Code":"Q-A","CanLiveInsights":false},{"Name":"Visitor Arrived","Description":"Visitor Arrived","Code":"VISARR","CanLiveInsights":true},{"Name":"Visitor Departed","Description":"Visitor Departed","Code":"VISDEP","CanLiveInsights":true},{"Name":"Docked","Description":"Device placed in docking station","Code":"DOCK-IN","CanLiveInsights":false},{"Name":"Undocked","Description":"Device removed from docking station","Code":"DOCK-OUT","CanLiveInsights":false},{"Name":"Gas concentrarion","Description":"Gas concentrarion (ppm)","Code":"GAS","CanLiveInsights":false},{"Name":"Distance ","Description":"Distance measurement, could be level, proximity etc ","Code":"DIST","CanLiveInsights":false},{"Name":"Alarm Distance","Description":"Alarm on distance measurement, could be level, proximity etc ","Code":"ALDIST","CanLiveInsights":false},{"Name":"Welfare OK","Description":"Welfare check has returned OK","Code":"WELFOK","CanLiveInsights":false},{"Name":"Steps","Description":"Step counter","Code":"STEPS","CanLiveInsights":true},{"Name":"Connection","Description":"Connection","Code":"CON","CanLiveInsights":false},{"Name":"Disconnection","Description":"Disconnect","Code":"DISCON","CanLiveInsights":false},{"Name":"Position By Button","Description":"Position By Button","Code":"PBB","CanLiveInsights":false},{"Name":"Alarm Welfare","Description":"Alert welfare not confirmed","Code":"ALA-W","CanLiveInsights":false},{"Name":"Welfare Timer Starts","Description":"Welfare Check in","Code":"WTS","CanLiveInsights":false},{"Name":"Welfare Stops","Description":"Welfare Check out","Code":"WSTP","CanLiveInsights":false},{"Name":"Alarm Ended","Description":"Alarm finished","Code":"ALA-F","CanLiveInsights":false},{"Name":"BRTH - Breath Rate","Description":"Rate of Breathing per minute","Code":"BRTH","CanLiveInsights":false},{"Name":"Sleep State","Description":"Sleep state ","Code":"SLPSTATE","CanLiveInsights":false},{"Name":"Alarm - Tilt","Description":"Alarm - Tilt Alert","Code":"ALTLT","CanLiveInsights":false},{"Name":"Alert – Fall Suspected","Description":"Alert – Fall Suspected","Code":"ALFS","CanLiveInsights":false},{"Name":"testMCImportExport","Description":"A test message code to verify it imports correctly into Acceptance! Modify Description.","Code":"testMCImportExport","CanLiveInsights":false},{"Name":"gaurav_code_name","Description":"gaurav_code_desc","Code":"gaurav_code","CanLiveInsights":false},{"Name":"SPO2","Description":"blood oxygen saturation","Code":"SPO2","CanLiveInsights":false},{"Name":"Command","Description":"Send a command to a protocol","Code":"CMD","CanLiveInsights":false},{"Name":"OTA - Battery Low","Description":"OTA procedure interrupted due to battery low","Code":"OBTL","CanLiveInsights":false},{"Name":"Call","Description":"","Code":"CALL","CanLiveInsights":false},{"Name":"Network Information","Description":"","Code":"NET","CanLiveInsights":false},{"Name":"Fault","Description":"device fault","Code":"FLT","CanLiveInsights":false},{"Name":"Cycle 2","Description":"Regular, cyclic, events from a device. Used when a second Cycle template is needed on a protocol","Code":"CYC2","CanLiveInsights":false}]}